ruby中的单行多重赋值

时间:2011-07-26 09:44:16

标签: ruby

在一行中分配一个空数组是否合适?

arun@arun:~$ irb
   irb(main):001:0> a = b = c = []
=> []
irb(main):002:0> b << "one"
=> ["one"]
irb(main):003:0> p a
["one"]
=> nil

因为我希望'a'是[]但是它表示b的值意味着“一”。这是期待的吗?

我也尝试使用字符串和整数对象。

irb(main):004:0> d = e = f = 0
=> 0
irb(main):005:0> f = 6
=> 6
irb(main):006:0> p d
0
=> nil
irb(main):007:0>

irb(main):007:0> q = w = e = r = "jak"
=> "jak"
irb(main):008:0> e = "kaj"
=> "kaj"
irb(main):009:0> p w
"jak"
=> nil
irb(main):010:0> p e
"kaj"
=> nil
irb(main):011:0>

它按照我的预期工作。那为什么不是阵列?

2 个答案:

答案 0 :(得分:21)

您正在做的是将[]分配给c,然后将其分配给b,最后将其分配给a

>> a = b = c = []
>> a.object_id
=> 2152679240
>> b.object_id
=> 2152679240
>> c.object_id
=> 2152679240

你想要的是

>> a,b,c = [], [], []
=> [[], [], []]
>> a.object_id
=> 2152762780
>> b.object_id
=> 2152762760
>> c.object_id
=> 2152762740

编辑:示例有效,因为你只需要明确分配一个新值(Fixnum无论如何都不能变异)。尝试就地修改字符串:

>> q = w = e = r = "jak"
=> "jak"
>> e << 'i'
=> "jaki"
>> w
=> "jaki"

答案 1 :(得分:3)

在Ruby中,一切都是对象,包括[]0"jak"(分别是Array,Integer和String的实例)。您将同一对象分配给多个变量 - 如果更改该对象(b << "one"),则引用该对象的每个变量都将反映该更改。当您使用赋值运算符=时,您没有更改对象 - 您正在为变量分配一个新对象。

在Michael Kohl的最后一个例子()中,他正在使用<<来修改变量引用的String对象。这就是变量仍引用相同对象的原因,引用该对象的所有字符串都反映了这一变化。