在Hash-Ruby上迭代

在Hash-Ruby上迭代,ruby,hash,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|

这是下面的正确答案,但我不理解为什么在最后一行键入“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

它的定义不一样

x在频率块排序_中定义

这里没有定义

如果你改为:

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

例如,但是x和y不是在{}之外定义的,或者在本例中,do…end

它是以相同的方式定义的,作为代码块参数,但不是相同的位置。代码块可以使用作为参数提供的变量或在其内部定义的变量,因此puts word是可以的,或者在父范围内(创建该块的代码在本例中为“顶级”),因此puts频率也可以


但是,
x
来自完全不同的代码块,因此底部的代码块不知道它
x
仅在传递给
频率的块中有意义。按排序

我认为您对占位符的范围感到困惑。在最后一行,您使用
|单词,频率|
作为
频率中的占位符。每个do |单词,频率|
,而您的
|x,y |
的范围是
频率=频率中的第一个
每个
。按{x,y}排序


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

作为提示,在输入代码块时,您可以突出显示整个内容,并按Ctrl-k将其格式化为代码块。或者突出显示并单击编辑工具栏中的
{}
按钮。可能重复的问题不是该问题的重复-这实际上是关于变量范围的。因此可以说“puts word”,因为它是每个块中的占位符?啊,我明白了。因此,如果第三行最后一行说
do | x,frequency |
放x
可以接受吗?