Последнее выражение в любом методе 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