新手问题 新人求教 Ruby 怎么在方法里改变外部值

ThanksSirAlec · 2017年09月28日 · 最后由 mizuhashi 回复于 2017年09月28日 · 1341 次阅读

比如

def change(a)
  a=Array.new(4,0)
end

num=[1,2,3,4,5,6,7,8,9,10]
change(letters)
puts letters

怎么才能在 change 方法里把 num 变成一个新的数组

def change(a)
  #do something exm: a.collect{} // 新的数组
end

num = [1,2,3,4,5,6,7,8,9,10]
num = change(num)
puts num

# 如果是实例变量可以这样
def change
  @num.collect!{|i| i+1}
end
@num = [1,2,3,4]
change
puts @num  => [2,3,4,5]

使用实例变量,或者全局变量(不建议用)

可以用 lambda

change = lambda do
  num = [1]
end
change.call
2.3.4 :001 > num = [1,2,3]
 => [1, 2, 3] 
2.3.4 :002 > define_method :change do
2.3.4 :003 >     num = Array.new(4,0)
2.3.4 :004?>   end
 => :change 
2.3.4 :005 > num
 => [1, 2, 3] 
2.3.4 :006 > change
 => [0, 0, 0, 0] 
2.3.4 :007 > num
 => [0, 0, 0, 0] 
2.3.4 :008 > 

不知道你是不是想要这个? 这个是扁平化作用域

简单来说,不建议这么做。

详细来说,因为我不知道 LZ 原本面对的问题具体是怎样的,所以不便直接给出答案。这很有可能是个 XY Problem:https://ruby-china.org/topics/7154

最简单的就是用 Array#replace 方法,对于 immutable 的变量,如果你非要这么做 https://github.com/CicholGricenchos/tricks/tree/master/caller_context_operate

需要 登录 后方可回复, 如果你还没有账号请 注册新账号