通过splat运算符引用块来传递参数

alf*_*alf 4 ruby splat

当使用splat运算符通过引用将参数传递给块时,似乎会复制参数.

我有这个:

def method
  a = [1,2,3]
  yield(*a)
  p a
end

method {|x,y,z| z = 0}
#=> this puts and returns [1, 2, 3] (didn't modified the third argument)
Run Code Online (Sandbox Code Playgroud)

我如何通过引用传递这些参数?如果我直接传递数组似乎可行,但splat运算符在这里更实用,直观和可维护.

tok*_*and 7

  1. 在Ruby中,当你编写时,x = value你正在创建一个新的局部变量,x无论它是否存在(如果它存在,名称只是反弹而原始值保持不变).因此,您无法以这种方式就地更改变量.

  2. 整数是不可变的.因此,如果您发送一个整数,则无法更改其值.请注意,您可以更改可变对象(字符串,哈希,数组......):

    def method
      a = [1, 2, "hello"]
      yield(*a)
      p a
    end
    
    method { |x,y,z| z[1] = 'u' }
    # [1, 2, "hullo"]
    
    Run Code Online (Sandbox Code Playgroud)

注意:我试图回答你的问题,现在我的意见是:更新方法或块中的参数会导致错误的代码(你再也没有参考透明度了).返回新值并让调用者自行更新变量(如果有的话).