2014-09-02 326 views
-4

有人能解釋第5行和第6行嗎?在第5行,是|word|的一個參數?爲什麼需要那裏?另外,在第6行上,也有{|a, b| b}參數。應該如何閱讀第6行?它在做什麼?紅寶石參數

puts "Input something: "      # 1 
text = gets.chomp       # 2 
words = text.split       # 3 
frequencies = Hash.new(0)     # 4 
words.each { |word| frequencies[word] += 1 } # 5 
frequencies = frequencies.sort_by {|a, b| b} # 6 
frequencies.reverse!       # 7 
+3

紅寶石**不是** Ruby on Rails的。 – 2014-09-02 14:55:09

+1

請閱讀一些紅寶書,或得到一些紅寶石教程。這些方法('each'和'sort_by')被稱爲迭代器,它們接受代碼塊作爲參數。廣泛地告訴你它是如何工作的,這是一種寬泛的方式,但是每個紅寶石指南都會很好地解釋它們。 – BroiSatse 2014-09-02 14:58:05

+4

'word'和'a,b'被稱爲[block arguments](http://www.ruby-doc.org/core-2.1。2/doc/syntax/calling_methods_rdoc.html#label-Block + Argument) – Stefan 2014-09-02 15:02:18

回答

2

在第5行,是|word|一個參數?

是的,這是一個block argument

爲什麼需要那裏?

Array#each的文檔:‘調用給定塊一次在self每個元素,傳遞該元素作爲參數’。

實施例:

words = ["foo", "bar", "baz"] 
words.each { |word| puts word } 

該塊被稱爲三次。在第一遍中,其塊參數word設置爲"foo",第二遍設置爲"bar",第三遍設置爲"baz"。每次使用puts打印word

輸出:

foo 
bar 
baz 

在您的例子,散列用來存儲字的頻率。在each循環中,單詞的計數遞增。

如何閱讀第6行?它在做什麼?

Enumerable#sort_by按塊的結果排序集合。例如,爲了通過字符串的長度排序字符串的數組可以使用:

["xxx", "xx", "x"].sort_by { |str| str.length } 
#=> ["x", "xx", "xxx"] 

frequencies由於是哈希,塊被調用用於每個。因此,兩個參數設置 - a是對的關鍵和b是對的值:

frequencies = { "foo" => 3, "bar" => 2, "baz" => 1} 
frequencies = frequencies.sort_by { |a, b| b } 
#=> [["baz", 1], ["bar", 2], ["foo", 3]] 

它按自己的價值觀哈希值。請注意,sort_by返回一個數組。該陣列被分配到frequencies變量。

代替ab你可以使用更具描述性的參數名:

frequencies.sort_by { |word, count| count }