用字母顺序用元音评估单词的方法

时间:2014-05-05 05:46:33

标签: ruby

如果单词元音按字母顺序排列,则此段代码返回true或false。

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] <= x[i + 1]。我对.all方法也不是很熟悉。为什么不改用.each

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

4 个答案:

答案 0 :(得分:1)

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

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

例如:

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

因此'b'大于'a'

答案 1 :(得分:1)

首先,您要在字符数组中拆分参数&#34; Word&#34; ,并将其存储在&#34; X&#34; 中。 然后,您选择了所有元音,并使用&#34; include?&#34; 方法将其存储在&#34; X&#34; 中。然后使用 .all?方法检查索引 0到x.length-1 之间的所有元素,不包括x.length-1索引。是的你也可以在这里使用 .each 而不是 .all 。 并且存在方法太空船(&lt; =&gt;)方法,其可用于比较两个字符串与其字母排名的关系。 &lt; =&gt;如果字符串相同,则返回0;如果左手字符串小于右手字符串,则返回-1;如果更大,则返回1。 希望这会帮助你!!!

答案 2 :(得分:0)

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

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?将仅返回true(请参阅Enumerable#all?

我们的数组[“o”,“e”]中有两个元素,all?执行一次,由(0..1).all?显示。它将0索引传递给块,并使用后面的一个字符串计算每个字符串。

my_vowels[0] <= my_vowels[1]代表我们示例中的"o" <= "e",其结果为false。

只要第一个字符串的值小于或等于另一个字符串,

<= (see Comparable docs)将为真。对于字符串,value由整数序数确定,您可以通过调用字符串上的.ord来找到它。

答案 3 :(得分:0)

作为参考,这就是我以更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