[英]Why is Ruby method argument value inexplicably changed?
这是方法的一些代码,该方法应该最终将加扰的单词与单词的小“字典”进行比较,然后将未加扰的单词返回。 请记住,此方法是不完整的。
def word_unscrambler(str, words)
p words
comparison = words.each_index {|i| words[i] = words[i].chars.sort.join}
p words
string = str.chars.join
comparison.each_index do |i|
return words[i] if string == comparison[i]
end
end
当我使用irb和水果列表作为参数“ words”测试该方法时,第一个“ p words”输出:
["apple", "orange", "pineapple"]
第二个“ p字”输出:
["aelpp", "aegnor", "aeeilnppp"]
我感到困惑的是,在“比较”的赋值语句之后更改了数组“单词”的值。 是的,“比较”被分配给“单词”的修改,但是以我的经验,赋值语句仅将值赋给赋值运算符左侧的变量。 即使这与我在时间编程中学到的一切都背道而驰,我还是试图通过创建另一个具有相同值的数组(称为“复制”)来隔离“单词”。 通过对代码的这种修改,我仍然最终得到带有重新分配值的“单词”。 我必须缺少方法参数或变量的一些基本方面。
那么,是什么导致了变化呢?
仔细看一下您的比较=行:
comparison = words.each_index {|i| words[i] = words[i].chars.sort.join}
在each_index块内,您正在更改数组中每个字符串的值:
words[i] = words[i].chars.sort.join
这是在单词中修改每个字符串。 因此,您希望“苹果”成为“ aelpp”
要构建一个新数组并将其分配给比较,您可能需要看一下map方法 。
comparison = words.map { |word| word.chars.sort.join }
这将创建一个新数组并将其分配给比较,该数组看起来像第二个p语句的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.