为什么Ruby方法参数值莫名其妙地改变了?

时间:2014-09-13 22:53:31

标签: ruby variables methods arguments variable-assignment

这是一个方法的代码,该方法最终应该将一个加扰的单词与一个小的"字典进行比较。单词并返回单词,解读。请记住,此方法不完整。

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和一个水果列表测试方法时,参数"单词",第一个" p单词"输出:

["apple", "orange", "pineapple"]

第二个" p字"输出:

["aelpp", "aegnor", "aeeilnppp"]

我很困惑数组的值"字"在"比较"的赋值语句后更改。是的,"比较"被分配给" words"的修改,但根据我的经验,赋值语句只为赋值运算符左侧的变量赋值。 虽然这与我在编程时所学到的一切都有所不同,但我试图隔离"单词"通过制作具有相同值的另一个数组,称为" copy"。通过对我的代码的这种修改,我仍然得到了"单词"重新分配的值。我必须忽略方法参数或变量的一些基本方面。

那么,是什么导致了变化?

1 个答案:

答案 0 :(得分:1)

仔细观察你的比较=行:

comparison = words.each_index {|i| words[i] = words[i].chars.sort.join}

在each_index块中,您将更改数组中每个字符串的值:

words[i] = words[i].chars.sort.join

这是用单词修改每个字符串。所以你会期待" apple"成为" aelpp"

要构建新数组并将其分配给比较,您可能需要take a look at the map method

comparison = words.map { |word| word.chars.sort.join }

这将创建并分配一个新数组进行比较,看起来就像是第二个p语句的输出。