考虑下面的 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 的工作方式吗?如果是的话,我该如何确保它不会影响调用者?
str[0]='e'
,原始字符串将会被改变。但是如果你执行str=nil
,原始字符串将保持不变,因为你只是改变了引用。此外,请注意 Ruby 中许多字符串函数都有两种变体——可变和不可变。可变的变体以 ! 结尾并更改原始字符串,而不可变的则不会更改。因此,str.reverse
将返回反转后的字符串,同时保持原始字符串不变,而str.reverse!
将反转原始字符串。这也适用于 Ruby 中的许多其他数据结构。 - Idan Arye