【问题标题】:ruby optional parameter, if changed, effects in caller?ruby 可选参数,如果更改,对调用者的影响?
【发布时间】:2012-05-06 01:25:52
【问题描述】:

考虑以下 ruby​​ 中的代码,假设我从某个地方调用了 prestart:

def tester(process_name, *host_list)
  hosts = []
  hosts = host_list[0]
  hosts[0] = nil
end

def prestart(process_name, *host)
  host_list = ['192.168.1.1', '192.168.1.2'] 
  puts host_list.inspect  # -> ['192.168.1.1', '192.168.1.2']
  tester(process_name, host_list)
  puts host_list.inspect  # -> [nil, '192.168.1.2']
  abort
end

它是如何变成 nil 的?这是红宝石的工作原理吗?如果是,我如何确保它不会影响来电者?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    数组是对象,因此是通过引用过去的。如果你想改变它而不影响原来的,你需要通过调用.dup来复制它。您可以在调用者或被调用方法中执行此操作。

    【讨论】:

    • 完全正确!!我错过了他们说数组是 obj 的部分 :)
    • 数组是大多数高级语言中的可变对象(纯函数式语言除外,其中没有什么是可变的)。还应该注意的是,在 Ruby 中,与大多数高级语言不同,字符串也是可变对象。
    • 你的意思是如果你在上面的例子中传递字符串,它的行为类似?影响来电者?
    • 如果你改变了字符串本身。也就是说 - 如果您执行 str[0]='e' 之类的操作,原始字符串将被更改,但如果您执行 str=nil,原始字符串将保持不变 - 因为您只更改了引用。另请注意,Ruby 中的许多字符串函数有两种变体 - 变异和非变异。变异变体以 !并更改原始字符串,而非变异则不会。因此str.reverse 将返回反向字符串,同时保持原始字符串不变,str.reverse! 将反转原始字符串。这也适用于 Ruby 中的许多其他数据结构。
    • -1。在 Ruby 中,没有任何东西是通过引用传递的。 Ruby 是按值传递的。总是。没有例外。没有如果。没有但是。
    猜你喜欢
    • 2013-10-06
    • 2015-01-29
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多