繁体   English   中英

为什么Ruby方法的参数值会发生莫名其妙的变化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM