Ruby中的else和elsif之间的区别

时间:2016-08-09 20:31:07

标签: ruby

在这段代码中,如果我通过"我的名字是bobby li"到longest_word它返回" bobby"。但是,如果我选择else而不是elsif,则会返回" li"。谁能解释一下?

def longest_word(sentence)
  words = sentence.split(" ")
  longest_word = nil
  word_idx = 0

  while word_idx < words.length
    current_word = words[word_idx]

    if longest_word == nil
      longest_word = current_word
    elsif longest_word.length < current_word.length
      longest_word = current_word
    end

    word_idx += 1
 end

 return longest_word
end

3 个答案:

答案 0 :(得分:2)

这不是你问的,但我希望它有用。

让我感到震惊的是你在你的功能中做了很多不必要的工作。以下是一些潜在的替代方案。

第一种方法:保留迭代器

  def longest_word(sentence)
    longest_word = nil

    sentence.split(" ").each do |current_word|
      longest_word ||= current_word
      longest_word = current_word if current_word.length > longest_word.length
    end

    longest_word
  end

在这里,使用sentence.split(" ").each do |current_word|可以跳过您正在做的所有idx内容。

现在,在您所说的代码中:

  if longest_word == nil
    longest_word = current_word
    ...
  end

我建议你使用:

  if longest_word.nil?
    longest_word = current_word
    ...
  end

或者更好:

  unless longest_word
    longest_word = current_word
    ...
  end

如果你更进一步,你可以使用尾随条件摆脱你的第一个if语句:

  longest_word = current_word unless longest_word

在ruby(IMO)中说这个的更惯用的方式是:

  longest_word ||= current_word

(有关||=的详细信息的Google'红宝石条件分配')。

之后,你可以说:

  if current_word.length > longest_word.length
    longest_word = current_word
  end

但我认为使用尾随条件更清晰:

  longest_word = current_word if current_word.length > longest_word.length

这种方法可以为您节省七行代码 - 这可能看起来不是很多。但是,随着时间的推移它会堆积起来。更重要的是,我认为阅读和理解可能更容易。

第二种方法:抛弃迭代器

而不是以上所有,你可以简单地说:

def longest_word(sentence)
  sentence.split(" ")
          .sort{|x,y| x.length <=> y.length}
          .last
end

这基本上说,“按照长度的升序对单词数组进行排序,然后返回最后一个元素”。

就个人而言,我写的就是:

def longest_word(sentence)
  sentence.split(" ").sort{|x,y| x.length <=> y.length}.last
end

你保存了12行(我喜欢这样做,所以我可以在屏幕上看到更多,而不必滚动我的代码)。

没有条件。没有任务。没有循环。只是干净和可读的红宝石善良。

无论如何,我希望有所帮助。

答案 1 :(得分:0)

在第一次迭代期间,longest_word为零,因此将执行if条件。如果你使用else,在循环的剩余迭代中,if条件永远不会评估为真,因为它不再是nil。

因此,无论current_word的长度是否大于longest_word,它都只会将current_word更新为longest_word。因此,如果longest_word代替else,您将始终将elsif作为最后一个字。

答案 2 :(得分:0)

如果您使用elsif,则始终检查条件current_word长度是否大于目前为止找到的longest_word,并仅更新longest_word如果条件评估为真,则current_word确实长于longest_word。所以答案是“鲍比”。

但如果您使用else,那么我们只需将longest_word更新为current_word,而不管current_word是否长于longest_word。所以,ans是单词[last_index],即“li”