[英]Iterating over the Hash - Ruby
這是下面的正確答案,但是我不明白為什么在最后一行中鍵入“ 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
它以與代碼塊參數相同的方式定義,但位置不同 。 代碼塊可以使用作為參數提供的變量或在其內部定義的變量,因此puts word
是可以的,也可以在父范圍內使用(創建塊的代碼-在這種情況下為“頂層”),因此puts frequencies
也可以。
但是, x
來自完全不同的代碼塊,因此底部的代碼塊對此一無所知。 x
僅在傳遞給frequencies.sort_by
的塊內具有含義。
它的定義方式不同。
x在頻率的sort_by塊中定義。
在那里沒有定義。
如果您改用它,它將起作用:
frequencies.each do |x, y|
puts x + " " + y.to_s
end
例如,但是x和y不在{}之外定義,在這種情況下,請...結束
我認為您對占位符的范圍感到困惑。 在最后一行使用|word,frequency|
作為frequencies.each do |word, frequency|
的占位符。 frequencies.each do |word, frequency|
,而您的|x,y|
的范圍是您的第each
frequencies = frequencies.sort_by { |x, y| y }
frequencies = frequencies.sort_by { |x, y| y }
順便說一句,也許最好是重命名|x, y|
特定的東西? 如果您沒有正確定義變量,方法,占位符等,您可能會迷失在代碼中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.