【问题标题】:method evaluating a word with vowels in alphabetical order按字母顺序评估带有元音的单词的方法
【发布时间】:2014-05-05 05:46:33
【问题描述】:

如果单词元音按字母顺序排列,这段代码返回真或假。

def ordered_vowel_word?(word)
  vowels = ['a','e','i','o','u']
  y = word.split('')
  x = y.select { |l| vowels.include?(l) }

  (0...(x.length - 1)).all? do |i|
    x[i] <= x[i + 1]
  end

end

但是我不太明白它是如何做到的。特别是我不明白最后一行x[i] &lt;= x[i + 1]。我对.all 方法也不是很熟悉。为什么不直接使用.each

x[i]x[i+1] 的值不是字母吗?我们如何比较小于或等于的字母值?这没有意义。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    .all? 将返回 true,如果给定的块对枚举中的所有元素计算为 true。 在这里,您正在检查所有元素是否小于或等于其下一个元素。

    小于或等于使用字符的整数序号进行比较。

    例如:

    > 'a'.ord
    # => 97 
    > 'b'.ord
    # => 98 
    

    所以'b' 大于'a'

    【讨论】:

    • 谢谢我对整数序数一无所知,这就是我如此困惑的原因
    【解决方案2】:

    首先,您将参数 "Word" 拆分为一个字符数组,并将其存储在 "X" 中。 然后你选择了所有的元音并使用 "include?" 方法将其存储在 "X" 中。然后使用 .all? 方法检查索引 0 到 x.length-1 之间的所有元素,不包括 x.length-1 索引。是的,您也可以在此处使用 .each 而不是 .all。 还有一种方法spaceship () 方法,可用于比较两个字符串的字母顺序。如果字符串相同, 方法返回 0,如果左侧字符串小于右侧字符串,则返回 -1,如果大于则返回 1。 希望对你有帮助!!!

    【讨论】:

      【解决方案3】:

      我相信命名是这种方法中最令人困惑的部分。让我们分解一下:

      y = word.split('')
      

      应该是my_letters = word.split(''),因为它返回一个数组,其中每个字母都是一个字符串(如["s", "o", "m", "e"]

      x = y.select { |l| vowels.include?(l) }
      

      应该是my_vowels = my_letters.select { |l| vowels.include?(l) }。这将从您的单词中返回一个元音数组(例如["o", "e"]

      (0...(my_vowels.length - 1)).all? do |i|
          my_vowels[i] <= my_vowels[i + 1]
      end
      

      all? 只会在给定块对所有元素都为真时返回真(参见Enumerable#all?

      我们的数组中有两个元素 ["o", "e"],all? 执行一次,如(0..1).all? 所示。它将 0 索引传递给块并评估每个字符串及其后的一个。

      my_vowels[0] &lt;= my_vowels[1] 在我们的示例中代表 "o" &lt;= "e",其计算结果为 false。

      &lt;= (see Comparable docs) 只要第一个字符串的值小于或等于另一个字符串,就会为真。对于字符串,值由整数序数确定,您可以通过在字符串上调用 .ord 来找到该序数。

      【讨论】:

        【解决方案4】:

        作为参考,这就是我将如何以更 Rubyish 的方式编写此函数的方式:

        def ordered_vowel_word?(word)
            vowels = ->char{'aeiou'[char.downcase]}
            vowels_in_word = word.chars.select &vowels
            vowels_in_word == vowels_in_word.sort
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-27
          • 2020-08-19
          • 2012-11-28
          • 2014-07-28
          • 1970-01-01
          相关资源
          最近更新 更多