如果单词元音按字母顺序排列,则此段代码返回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]
字母的值吗?我们如何比较小于或等于的字母值?这没有意义。
答案 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