防止Ruby中的副作用

The*_*nce 2 ruby

a = [1,2,3,4]
b = a << 5
a == [1,2,3,4] # returns false
Run Code Online (Sandbox Code Playgroud)

如何分配ba5追加到末尾,而无需修改a本身?

Yev*_*yev 9

只需加两个数组:

a = [1,2,3,4]
b = a + [5]

# b == [1, 2, 3, 4, 5]
# a == [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)


Joh*_*web 6

Ruby的变量保持引用对象和=操作复制引用.

看来你希望:clone a

irb(main):001:0> a = [1,2,3,4]
=> [1, 2, 3, 4]
irb(main):002:0> b = a.clone << 5
=> [1, 2, 3, 4, 5]
irb(main):003:0> a
=> [1, 2, 3, 4]
irb(main):004:0> b
=> [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

  • 或者也许[`dup`](http://www.ruby-doc.org/core-2.0/Object.html#method-i-dup),取决于OP想要的内容.另请参阅[Ruby的`dup`和`clone`方法之间有什么区别?](http://stackoverflow.com/questions/10183370/whats-the-differences-between-ruby-dup-and-clone-method) (4认同)

saw*_*awa 5

我通常这样做:

b = [*a, 5]
Run Code Online (Sandbox Code Playgroud)

  • 或者更简单地说:`b = *a, 5` (3认同)