赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
本帖最后由 紫苏 于 2010-9-17 08:03 编辑
左值——赋值运算符 `=' 左边的值
右值——赋值运算符 `=' 右边的值
Ruby 有一个继承自 Perl 的语法糖:平行赋值,它缩短了赋值语句的代码体积。平行有“并发”之意,即同时赋值,互不干扰。这是最基本的平行赋值语法,1、2、3 按出现顺序被分别赋给了 a、b、c。
当最后一个右值是带了星号前缀的数组对象时,数组会被展开并把元素依次赋给对应的左值:- arr = [ 2, 3 ]
- a,b,c = 1,*arr
复制代码 这和第一句代码的运行效果没区别。
当右值只有一个,而左值不止一个时,右值就会被当做或转换为数组对象,并依次把元素赋给匹配的左值:- a,b,c = Time.now.to_a
- p a,b,c
复制代码 虽然平行赋值在实现层必然不是真正意义上的平行,但经过 Ruby 的抽象层后,在用户看来这确实是平行的,以下代码可以用来交换两个变量的值,而如果赋值有先后顺序(不并发),交换则不会成功:如果左值数量多于右值,没有匹配右值的左值会被赋为 nil;如果右值数量多于左值,没有匹配左值的右值会被忽略。
如果最后一个左值有星号作为前缀,那么 Ruby 会保证它接收到的是一个数组。如果这时左值数量少于右值,那么剩下的右值会被一起封装到数组中赋给这个左值:还可以给左值添加括号进行“嵌套赋值”,解决了数组形式的右值不能带着星号前缀出现在右值列表尾部之前的问题:- (a,b,c),d = [1,2,3],4
- p a,b,c,d
复制代码 Ruby 的块参数的传递、Proc 参数的传递都使用平行赋值的规则:- def foo
- yield [1, [2, 3], 4], *[5, 6]
- end
- foo { |(a,(b,c),d),e,f| p a,b,c,d,e } # a、b、c、d、e 分别被赋予了 1、2、3、4、5
复制代码 |
|