在Hash-Ruby上迭代
这是下面的正确答案,但我不理解为什么在最后一行键入“puts word”是可以的,而键入“puts x”是不可接受的,因为它的定义几乎完全相同在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 "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
可以接受吗?