1

这是下面的正确答案,但我不明白为什么可以在最后一行输入“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
4

3 回答 3

2

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

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

于 2013-11-12T19:00:11.570 回答
0

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

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

于 2014-07-18T08:39:13.730 回答
0

它的定义方式不同。

x 在 sort_by 频率块中定义。

它没有在那里定义。

如果你把它改为:

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

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

于 2013-11-12T18:58:41.480 回答