迭代Hash - Ruby

时间:2013-11-12 18:55:26

标签: ruby hash

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

3 个答案:

答案 0 :(得分:2)

它以相同的方式定义,作为代码块参数,但不是相同的地方。代码块可以使用作为参数提供的变量或在其自身内定义的变量,因此puts word可以,或者在父作用域中(创建块的代码 - 在这种情况下为“顶级”),因此{{1}也没关系。

但是,puts frequencies来自完全不同的代码块,因此底部的块不知道它。 x仅在您传递给x的区块中具有意义。

答案 1 :(得分:0)

它没有以相同的方式定义。

x在sort_by频率块中定义。

那里没有定义。

如果您改为放置它会起作用:

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

,但x和y未在{}之外定义,或者在这种情况下,请执行...结束

答案 2 :(得分:0)

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

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