基本概念

1. 变量

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

2. 没有闭包

  • 闭包是指函数可以使用外部的自由变量
  • 没有闭包是指函数不可以使用外部的自由变量
  • 用Ruby其他语法可以实现闭包
a = 1
def  f1
    p a
end

f1() # 括号可以省略
# 以上结果会报错:a 不存在

3. 多重赋值

  • 简化
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

4. 字符串

  • 单引号
    • puts '12\n34'
    • 不会转义
  • 双引号
    • puts "12\n34"
    • 会把 \n 转义成换行
  • 多行字符串
    • puts <<eos
    • 12
    • 34
    • eos
    • 如果有\n会转义成换行

5. log

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

6. 注释

  • 单行注释
 # 这是单行注释
 # 这是第二行注释
  • 多行注释
=begin
多行注释
这是第二行注释
=end

控制语句

1. if语句

if a>3 then p '大' end

if a>3 then p '大‘ else p '小' end

#  ruby的if是有值的
p(if a>3 then '大 else '小 end)

# 如果if后回车,可以省略then
p(if a>4
    '大'
elseif a>2
    '中'
else
    '小’
end)
b = if a>3 then 'big' else ' small' end
b = a>3 ? 'big' : 'small'

# 如果if成功,则返回if前面的值
return if error
# if的反义unless
return unless success

2. case语句

基本语法:

case x
    when 1
        '1'
    when 2
        '2'
    else 
        'other'
end

可匹配多个值:

case x
    then 1, 2, 3
        '1 or 2 or 3'
    then 4, 5, 6
        '4 or 5 or 6'
end        

循环

1. .times方法

7.times do
    p '一次'
end

# do end 可以用 { } 代替
7.times { p '一次' }

# 相当于
[0,1,2,3,4,5,6].map((i) => {
    p '一次‘
})
  • .times是个函数
  • do...end是代码块
  • {..}也是代码块
  • 一般多行用do...end单行用{..}
  • 代码块作为.times函数的参数
  • Ruby的函数调用可以省略()
# 以下两种方式都是可以写成一行
7.times do |i|
    p '#{i+1}次"
end

7.times { |i|
    p "#{i+1}次"
}

2. .each方法

names = ['Frank' , 'Jack']
names.each do | name | 
    p name
end

names.each { | name | p name }

(1..7).each do | i |
    p i
end

(1..7).each { | i | p i }

3. for关键字

# 1到5
for i in 1..5 #do可省略
    p i
end

# 遍历数组
names = ['Frank',' Jack']
for name in names
    p name
end

4. until / while关键字

i=1
while i<3
    p i
    i += 1
end

j=1
until j>=3
    р j
    j += 1
end

5.loop关键字

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

6. 跳出循环

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

数据类型

只有对象,可用.class查看类

  • 整数-Integer对象/Numeric对象
  • 浮点数- Float对象
  • 字符串-String对象
  • 数组-Array对象
  • 正则表达式- Regexp对象
  • 时间- Time对象
  • 文件- File对象
  • 符号- Symbol对象
  • 异常- Exception对象
  • 散列- Hash对象

标识

  • 每个对象都有一个object_ id属性,表示其唯一性

数组

mixed=[1, '中,2, '国',3]
mixed.size 
# => 5
mixed.methods
# => 打印出mixed的所有方法,如 pop / shift / push / append / find / find_ _al l/ each / each_ with_ index,这些方法都是symbol

散列

创建一个散列

person = {name: 'frank, age: 18}

symbol

  • 上面的name和age不是字符串,而是symbol
  • 等价于person={ :name=> 'frank, :age=> 18 }
  • person.keys
  • => [:name, :age]
  • 如果你想要字符事作为key,应该写成
  • person={ 'name' => 'frank, 'age' => 18}

注意

  • 你可以认为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: 'frank' , age:18}
如果你想要获取frank

  • 不能用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:'frank, 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_ hij.cal() #括号可以省略

文档