ruby可选参数,如果更改,在调用者中的效果如何?

ruby可选参数,如果更改,在调用者中的效果如何?,ruby,Ruby,考虑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.

考虑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

怎么会变成零呢?ruby就是这样工作的吗?如果是,我如何确保它不会影响来电者

数组是对象,因此通过引用是过去的。如果要在不影响原件的情况下对其进行更改,则需要通过调用
.dup
对其进行复制。您可以在调用方或被调用方法中执行此操作。

完全正确!!我错过了他们说数组是obj的部分:)在大多数高级语言中数组是可变的对象(除了纯函数式语言,没有什么是可变的)。还应该注意的是,在Ruby中,与大多数高级语言不同,字符串也是可变对象?是否影响调用方?如果更改字符串本身。也就是说,如果您执行类似于
str[0]='e'
的操作,原始字符串将被更改,但是如果执行
str=nil
,原始字符串将保持不变,因为您只更改了引用。还要注意,Ruby中的许多字符串函数有两种变体——变异和非变异。变异的变异以!并更改原始字符串,而非变异字符串不会更改。因此,
str.reverse
将返回反向字符串,同时保持原始字符串的完整性,
str.reverse将反转原始代码。Ruby中的许多其他数据结构也是如此。在Ruby中,没有任何东西是通过引用传递的。Ruby是按值传递的。总是。没有例外。没有如果。没有但是。