Ruby 基础

Ruby 的基本概念

运行 ruby 的方式

  • irb
  • 可交互命令行
  • 你每次输入一个式子,他都会用 => 给出一个值
  • ruby
  • ruby 加文件路径

变量

  • 没有关键字
    • 没有 var、let、const,直接 a = 1 就行
  • 局部变量
    • 小写字母开头
    • _开头
  • 全局变量
    • $ 开头
  • 类变量
    • @@ 开头
  • 实例变量
    • @ 开头

ruby 默认没有闭包

a = 1
def f1
   p a
end
f1() // 括号可以省略
// 报错 :a 不存在
  • 闭包是指函数可以使用外部的自由变量
  • 没有闭包是指函数 不可以 使用外部的自由变量
  • 用 Ruby 其他语法也可以实现闭包

全局变量

$a = 1
def f1
   p $a
end
f1()
// 1
  • 加上 $ 就是全局变量

常量

A = 1
def f1
   p A
end
f1()
// 1
  • 大写就是常量

多重赋值(JS叫做析构赋值)

  • 简化
  • a, b, c = 1, 2, 3
  • a, b, *c = 1, 2, 3, 4, 5
  • a, *b, c = 1, 2, 3, 4, 5
  • 交换
  • a, b = b, a
  • 数组
  • arr = [1, 2]
  • a,b = arr

字符串(有十几种)

  • 单引号
  • 引号里面什么就是什么
  • puts '12\n34'
  • 不会转义
  • 双引号
  • puts “12\n34”
  • 会把 \n 转义成换行
  • 多行字符串
  • puts <<xxx(任意字符开头同样结尾,一般用 eos, endOfString)
  • 12
  • 34
  • xxx
  • 如果有 \n ,会转义成换行

log

  • *打印数据
  • print('a', 'b') - 默认不加换行
  • puts('a', 'b') - 默认每个加换行
  • p 'a', 'b' - 加换行,不转义,且以人类理解的形式加标记
  • 只要没有歧义,括号 () 都可以不写
  • 使用场景
  • 程序员一般使用 p
  • 日志一般使用 puts 和 print

注释

  • 单行注释
  • 这是单行注释

  • 这是第二行注释

  • 多行注释
  • =begin
  • 多行注释
  • =end

Ruby 的控制语句

ruby 的 if 语句

if a>3 then p '大' end
if a>3 then p '大' else p '小' end
// if 是有返回值的,所以可以直接打印
p(if a>3 then p '大' else p '小' end)
p(if a>4
  '大'
elseof a>2
  '中'
else
  '小'
end)
b = if a>3 then 'big' else 'small' end
b = a>3 ? 'big' : 'small'
return if error // 因为 if 有返回值,所以可以这么简写,如果有 error 就 return 出去
return unless success // 另一种写法 // if not success

case 语句

z = case x
when 1
'1'
when 1,2
'2 or 3'
else
'hi'
end

Ruby 的循环

循环

.times

7.times do
  p '一次'
end
7.times { p '一次' } // 用花括号代替 do end
// 等价于 [1,2,3,4,5,6,7].map(v => console.log(v))

获取 i,和插值

|i|

7.times do |i|
  p "#{i + 1}次" // 注意要用双引号,不能用单引号
end
7.times { |i|
  p "#{i + 1}次"
}

.each (一般用于遍历数组)

name = ['a', 'b']
names.each do |name|
  p  name
end
(1..7).each do |i| // 两个点构造类似数组的东西,其实他是一个 range((1..7).class)
  p i
end

for

// 1 到 5
for i in 1..5 do
  p i
end
// 遍历数组
names = ['a', 'b']
for name in names
  p name
end

while / until

i = 1
while i<3
  p i
  i+=1
end
// 和下面等价,与 if,unless 一对对应
j =1
until j>=3
  p j
  j+=1
end

loop

loop do
  p 'ruby'
end
// 上面代码会一直无线循环,除非在里面写 break

跳出循环

  • break 表示退出所有循环
  • next 表示退出当前循环,进入下一次循环
  • 对应 JS 里的 break 和 continue

Ruby 中的数据类型

  • 只有对象,可用 .class 查看类
  • 不像 JS 有基本类型,ruby 中的数字 1 也是对象(所以 7.time 可以运行)
  • 整数 - Intrger 对象 / Numeric 对象
  • 浮点数 - Float 对象
  • 字符串对象 - String 对象
  • 数组 - Array 对象
  • 正则表达式 - Regexp 对象
  • 时间 - Time 对象
  • 文件 - File 对象
  • 符号 - Symbol 对象
  • 异常 - Exception 对象
  • 散列 - Hash 对象
  • 标识:每一个对象都有一个 object_id 属性,表示其唯一性([1,2] == [1,2] // true)

Ruby 的数组和散列

Ruby 数组

  • arr = [1, 2, 3]
  • arr.size // 5
  • arr.methods // 打印出所有的方法,如 pop / shift / push / append / find / find_all / each / each_with_index ... 注意这些方法前面都有一个冒号,这是 symbol

Ruby 散列

  • 创建一个散列*
  • person = {name: 'zch', age: 18}
  • symbol
  • 上面的 name 和 age 不是字符串,而是 symbol
  • person.keys // [:name, :age]
  • 打印 person 发现为 person = {:name => 'zch', :age => 18},所以也可以这样声明上面的person(古老的时候都是这么声明的)
  • 注意不要使用 person.sex = '男' 来添加属性,因为在 ruby 中所有的 . 后面都是方法,上面会被理解成调用 person 的 sex 方法!
  • 注意可以把 symbol 理解为轻量的字符串,功能更少(打印出 'name'.methods:name.methods 即可发现),他把其他字符串其他作为 key 没用的方法都删了,所以作为key一般都使用 symbol
  • 可以互相转换 :name.to_s 得到字符串,'name'.to_sym 的到符号

遍历散列

.each

  • 和数组方法一致,但是多了一个参数
person.each do |key, value|
  p "key: #{key},value:#{value}"
end
// 输出时,symbol 会自动变为 string

与 JS 的区别1

  • person = {name: 'zch', age: 18}
  • 如果你想获取 'zch'
  • 不能用 person.name
  • 必须用 person[:name]
  • 不能用 person['name']
  • 必须用 person[:name]
  • 'name' 和 :name 是不同的
  • person['name'] = 'jack'
  • person.keys => [:name, :age, 'name']

与 JS 的区别2

def say_hi
  p 'hi'
end
person = {name: 'zch', age: 18}
  • 如果想要给 person 加一个方法 / 函数
  • 不能用 person[:say_hi] = say_hi
  • 因为 say_hi 等价于 say_hi()
  • say_hi 的返回值为 p 'hi' 的返回值,也就是 'hi'
  • 所以相当于 person[:say_hi] = 'hi'
  • 可以使用 lambda 表达式做到
  • person[:say_hi] = lambda {p 'hi'}
  • person[:say_hi].call // 'hi'

练习:
https://github.com/zch233/ruby-demo1
参考:
https://www.runoob.com/ruby/ruby-tutorial.html
https://devdocs.io/ruby~2.6/
https://apidock.com/ruby/search?query=array&commit=Search

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335