2014-09-02 279 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 }