【问题标题】:Why is Ruby method argument value inexplicably changed?为什么 Ruby 方法参数值莫名其妙地改变了?
【发布时间】:2014-11-07 19:50:50
【问题描述】:

下面是一些方法的代码,该方法应该最终将一个加扰的单词与一个小的单词“字典”进行比较,然后返回未加扰的单词。请记住,此方法是不完整的。

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 words”输出:

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

我很困惑数组“words”的值在“comparison”的赋值语句之后发生了变化。是的,“比较”被分配给“单词”的修改,但根据我的经验,赋值语句只为赋值运算符左侧的变量赋值。 尽管这与我在时间编程中学到的一切背道而驰,但我尝试通过创建另一个具有相同值的数组(称为“复制”)来隔离“单词”。通过对我的代码的这种修改,我最终仍然得到了带有重新分配值的“单词”。我一定遗漏了方法参数或变量的一些基本方面。

那么,造成这种变化的原因是什么?

【问题讨论】:

    标签: ruby variables methods arguments variable-assignment


    【解决方案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 语句的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2014-01-23
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多