我不明白:
2.0.0-p598 :003 > a=[1,2,3]
=> [1, 2, 3]
2.0.0-p598 :004 > (a << 1).uniq!
=> [1, 2, 3]
2.0.0-p598 :005 > a
=> [1, 2, 3]
我不明白为什么实际修改了。我猜想括号会使uniq方法对括号中的所有内容起作用,而不是变量。有人可以解释一下吗?
答案 0 :(得分:4)
a << 1
返回a
本身。
您的代码会修改数组两次。
首先将1
推送到数组a
,然后从a
返回(a << 1)
。然后你打电话给uniq!
。
这里是代码一步一步地执行的操作,没有链接:
irb(main):001:0> a = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> a << 1
=> [1, 2, 3, 1]
irb(main):003:0> a
=> [1, 2, 3, 1]
irb(main):004:0> a.uniq!
=> [1, 2, 3]
irb(main):005:0> a
=> [1, 2, 3]
请注意,该方法的名称末尾有一个感叹号(bang!)。这是Ruby中用于修改它们所要调用的对象的方法的命名约定。您可以使用uniq
代替uniq!
,并且a
数组未经修改。
irb(main):001:0> a = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> a << 1
=> [1, 2, 3, 1]
irb(main):003:0> a
=> [1, 2, 3, 1]
irb(main):004:0> a.uniq
=> [1, 2, 3]
irb(main):005:0> a
=> [1, 2, 3, 1]