2011-11-21 59 views
3

我想知道计数变量有什么作用,最后一个结束之前?计数有什么用途?第7行

# Pick axe page 51, chapter 4 

# Count frequency method 
def count_frequency(word_list) 
    counts = Hash.new(0) 
    for word in word_list 
     counts[word] += 1 
    end 
    counts #what does this variable actually do? 
end 

puts count_frequency(["sparky", "the", "cat", "sat", "on", "the", "mat"]) 

回答

8

任何Ruby方法的最后一个表达式是该方法的返回值。如果counts不在该方法的末尾,返回值将是for循环的结果;在这种情况下,这就是word_list阵列本身:

irb(main):001:0> def count(words) 
irb(main):002:1> counts = Hash.new(0) 
irb(main):003:1> for word in words 
irb(main):004:2>  counts[word] += 1 
irb(main):005:2> end 
irb(main):006:1> end 
#=> nil 
irb(main):007:0> count %w[ sparky the cat sat on the mat ] 
#=> ["sparky", "the", "cat", "sat", "on", "the", "mat"] 

另一种方式有人可能会写同样的方法在1.9:

def count_frequency(word_list) 
    Hash.new(0).tap do |counts| 
    word_list.each{ |word| counts[word]+=1 } 
    end 
end 

虽然有些人认为使用tap这样是滥用。 :)

而且,为了好玩,这里是一个稍微慢的,但是,纯粹的功能版本:

def count_frequency(word_list) 
    Hash[ word_list.group_by(&:to_s).map{ |word,array| [word,array.length] } ] 
end 
+0

+1用于解释为什么在该方法结束时需要“计数”行。 – Teddy

+0

所以它类似于“返回计数”,对吧?如果是这样,对于初学者来说这很棘手,但很好知道。 – jimmyc3po

+0

@ jimmyc3po正确;在Ruby中,你可以在你的方法的任何地方放置一个显式的'return'。然而,这并不常见。相反,最后一个表达式的结果通常用作返回值。 – Phrogz

0

重要的是一本字典,即是按键值的关联图。

在这种情况下,单词是键,值是出现次数。

字典从功能count_frequency

1

它提供了该函数的返回值返回;它是如何将结果(存储在该变量中)传回给调用者(即,最后的代码行)。将在Ruby函数中计算出的最后一个表达式用作返回值。

4

Ruby不要求您使用return语句在方法中返回值。如果省略明确的return语句,则将返回方法中评估的最后一行。