使用注入方法找到最长的单词

时间:2017-06-18 19:45:17

标签: ruby

找到最长的单词。

longest = %w{cat sheep bear}.inject do |memo, word|
  memo.length > word.length ? memo : word
end

我猜测memo将以值"cat"开头,因为inject没有收到任何参数。我还猜测word的第一个值是sheep,然后是wordbear

我没有关注块及其语法中发生的事情。如果有人可以详细说明,我将不胜感激。

2 个答案:

答案 0 :(得分:5)

<强> 1。因此,我猜测备忘录将以值cat开始,因为注入没有传递给它的参数。

Documentation says:

  

如果没有明确指定备忘录的初始值,那么   第一个集合元素用作备忘录的初始值。

<强> 2。我还猜测第一个单词将是绵羊......然后是下一个单词,承担。

您可以使用puts检查每个阶段栏的最终分配,但这只是注入方法的返回值:

longest = %w{ cat sheep bear }.inject do |memo, word|
  puts "memo is currently #{memo}", 
       "word is currently #{word}",
       "-----------------------"
  memo.length > word.length ? memo : word
end

#memo is currently cat
#word is currently sheep
#-----------------------
#memo is currently sheep
#word is currently bear
#-----------------------

longest #=> "sheep"

另一种方式

最后另一种更加Rubyish的方法来获得最长的词:

%w{ cat sheep bear }.max_by(&:length) #=> "sheep"

答案 1 :(得分:1)

使用inject,该块应返回memo

的新值

在这种情况下,conditional operator用于返回两个值中的一个:memo的现有值,如果memo长于当前字词或word如果当前单词的长度或长度相同。也就是说,这是一种通过保持memo中迄今为止最长的单词的单词列表的方法(或者当长度被绑定时最近看到的单词。)

然后在结尾inject返回memo的最终值。