Ruby:与块迭代器链接的方法如何工作?

时间:2013-12-18 22:06:01

标签: ruby

以下代码似乎有效。我不确定为什么......据我所知.each_char采用代码块和select方法一样。所以我是Ruby的新人并且如果之前已经问过这个问题就道歉。

以下是代码:

def word_test(word)
    vowels = ["a","e","i","o","u"]
    word_vowels = Hash.new()

    word_vowels = word.to_s.each_char.select {|char| vowels.include?(char)}
    if word_vowels == word_vowels.sort
        return true
    end
end

word_test("hello")

如何将需要代码块的方法附加到方法上?

2 个答案:

答案 0 :(得分:3)

查看String#each_char的文档。 “将str中的每个字符传递给给定的块,如果没有给出块,则返回一个枚举器。”在Ruby文档中经常出现这个frase“或返回枚举器(如果没有给出块”) - 这就是使这种“堆叠方法在彼此之上”有用的原因。实际上它被称为“方法链”。

旁注:

if word_vowels == word_vowels.sort
    return true
end

#better:

word_vowels == word_vowels.sort

答案 1 :(得分:1)

each_char要么为一个字符串中的每个字符调用一个块,要么返回一个可用于其他目的的Enumerator对象。在这种情况下,看起来这是一种从字符串中选择所有元音的圆形方式。

一种更有效的方法是:

def test_word(word)
  word.match(/[aeiou]/i)
end

这基本上是一次性完成的。如果使用正确,正则表达式非常强大。