【问题标题】:Ruby: How does method chaining with block iterators work?Ruby:使用块迭代器的方法链如何工作?
【发布时间】:2013-12-18 22:06:00
【问题描述】:

下面的代码似乎工作。我不知道为什么……据我所知,.each_charselect 方法一样需要一个代码块。所以我完全是 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")

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

【问题讨论】:

标签: ruby


【解决方案1】:

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

旁注:

if word_vowels == word_vowels.sort
    return true
end

#better:

word_vowels == word_vowels.sort

【讨论】:

  • 谢谢。所以在我提到的情况下,.each 方法将一个枚举器传递给 .select,它为枚举器提供一个参数,这实际上是 .each 方法的一个参数?
  • @ZachSmith each_char 将字符串转换为字符的“虚拟数组”。那就是:它不是一个数组,但它的行为就像一个 - 你可以迭代它。更好的是,因为枚举器是可枚举的(从字面上看,它们包括可枚举模块),所以 a lot of powerful methodsselect 就是其中之一。
【解决方案2】:

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

更有效的方法是:

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

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

【讨论】:

  • 这不是它正在做的事情。它正在检查元音是否按字母顺序出现在给定单词中。
  • 原始方法也区分大小写,尽管这可能不是有意的。 s = word.scan(/[aeiou]/); s == s.sort 应该产生等效的结果
  • @p11y 啊,很好。原来的方法很混乱,不清楚。
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 2014-02-26
  • 1970-01-01
  • 2019-09-27
  • 2018-10-31
  • 2012-06-18
  • 1970-01-01
相关资源
最近更新 更多