[Ruby 学习笔记] 5. 基本表达式

1. 基本表达式

没啥好说的~~~~~ 唯一要注意的就是 Ruby 不支持自加(++)和自减(--),可以使用 += 和 -= 代替。

1 + 2
a = 3
a += 4

2. 命令展开

在 Ruby 中,我们可以直接用反引号(`)执行系统命令。其实只是执行了 Kernel.`() 方法,不过把这个当作表达式,感觉有点古怪。
puts `ver`

输出:
Microsoft Windows XP [版本 5.1.2600]

当然,我们可以重载这个方法。
def `(cmd)
  "Command:#{cmd}\n" + Kernel.`(cmd) 
end

puts `ver`

3. 赋值

基本赋值语句
a = b = c = 1       # a = 1, b = 1, c = 1
a = (b = 1 + 2) + 3        # a = 6, b = 3

并行赋值语句 (看下面的代码,估计会有点晕~~~~)
a = 1
b = 2
a, b = b, a
puts a, b

输出:
2
1

其实很简单,接着看下面的规则。

(1) 在赋值操作之前,首先按顺序计算右边的值,并将其保存到数组中。
x = 0
a, b, c = x, (x += 1), (x += 2)
puts a, b, c

输出:
0
1
3

(2) 当赋值语句多于一个左值时,表达式将返回由右值组成的数组。

(3) 如果赋值语句的左值多于右值,多于左值被忽略。
a, b, c = 0, 1
puts a, b, c

输出:
0
1
nil

(4) 如果右值多于左值,额外的右值被忽略。

(5) 如果仅有一个左值而有多个右值,则左值直接被赋值为数组。
a = 0, 1
puts a.class
puts a

输出:
Array
0
1

(6) 如果最后一个左值有一个 "*" 前缀,则多余的右值以数组方式赋值给该变量。
a, b, *c = 1, 2, 3, 4, 5
puts a
puts b
puts "------------"
puts c

输出:
1
2
------------
3
4
5

还有几种复杂点的。
a = [1, 2, 3, 4, 5]

b, c = 99, a         # b=99, c=[1,2,3,4,5]
b, *c = 99, a        # b=99, c=[[1,2,3,4,5]]
b, c = 99, *a        # b=99, c=1
b, *c = 99, *a      # b=99, c=[1,2,3,4,5]

还有一种嵌套赋值语句。
a, (b, c), d = 1, 2, 3, 4
puts a, b, c, d

输出:
1
2
nil
3

看不明白?很简单,括号内的变量在第一次赋值操作时被当作一个变量处理,根据并行赋值规则,自然只有一个 "2" 了。然后对括号内的变量进行第二轮赋值,自然 c = nil 。
a, (b, c), d = 1, [2, 3], 4
puts a, b, c, d

输出:
1
2
3
4
a, (b, *c), d = 1, [2, 3, 100], 4
puts b, "----", c

输出:
2
----
3
100

4. 布尔表达式

Ruby 对 "真" 的定义很简单:任何不是 nil 或者 false 的值都是 true,所以下面的演示中,尽管 line 的值是字符串,依然可以完成整个循环。
while line = gets
    puts line
end

Ruby 的布尔判断采取 "短路求解"(当第一个操作书符合或不符合时,放弃后续判断),同时定义了新的操作符 "defined?" 来判断参数是否已经被定义。
puts defined?(a)

a = 1
puts defined?(a)

输出:
nil
local-variable

如果参数未定义,defined? 返回 nil,否则返回一个标记字符串。

和我们所习惯的布尔表达式不同的是,Ruby 操作符 &&、and、||、or 返回首个决定条件真伪参数值,而不是 true 或 false。
puts "a" && "b" # a 为真,所以决定表达式真伪的是 b,返回 b。
puts nil && "b" # nil 导致短路求解,故返回 nil。
puts "a" || "b" # 同样是短路求解,返回 a。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值