【问题标题】:Iterating over the Hash - Ruby遍历哈希 - Ruby
【发布时间】:2013-11-25 02:21:16
【问题描述】:

这是下面的正确答案,但我不明白为什么可以在最后一行输入“puts word”,而输入“puts x”是不可接受的,因为它的定义几乎完全相同方式

puts "Text please "
text = gets.chomp

words = text.split(" ")
frequencies = Hash.new{0}

words.each { |word| frequencies[word] += 1}

frequencies = frequencies.sort_by { |x, y| y }
frequencies.reverse!
frequencies.each do |word, frequency|
    puts word + " " + frequency.to_s
end

【问题讨论】:

  • 作为提示,当输入代码块时,您可以突出显示整个内容并按 Ctrl-k 将其格式化为代码块。或者突出显示并单击编辑工具栏中的{} 按钮。
  • 不是那个问题的重复 - 这实际上是关于变量范围的。

标签: ruby hash


【解决方案1】:

它的定义方式与代码块参数相同,但与位置不同。代码块可以使用作为参数提供的变量或在其内部定义的变量,所以puts word 是可以的,或者在父范围内(创建块的代码 - 在这种情况下是“顶级”),所以puts frequencies 也是好的。

但是,x 来自一个完全不同的代码块,因此底部的块不知道它。 x 仅在您传递给 frequencies.sort_by 的块内有意义。

【讨论】:

  • 啊,我明白了。那么如果倒数第三行说do |x, frequency|puts x 可以接受吗?
【解决方案2】:

它的定义方式不同。

x 在 sort_by 频率块中定义。

那里没有定义。

如果你把它改为:

frequencies.each do |x, y|
    puts x + " " + y.to_s
end

例如,但 x 和 y 没有在 {} 之外定义,或者在这种情况下,do...end

【讨论】:

  • 所以可以说“puts word”,因为它是 .each 块中的占位符?
【解决方案3】:

我认为您对占位符的范围感到困惑。在最后一行,您使用|word,frequency| 作为frequencies.each do |word, frequency| 中的占位符,而您的|x,y| 的范围为each 中的第一个eachfrequencies = frequencies.sort_by { |x, y| y }

顺便说一句,最好将|x, y| 重命名为特定名称?如果您没有正确定义变量、方法、占位符等,您可能会迷失在代码中。只是一个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2016-02-27
    相关资源
    最近更新 更多