Ruby中的高阶迭代器?

时间:2010-08-17 15:01:36

标签: ruby iterator

我正在阅读关于.each迭代器的Ruby问题,并且有人声称如果高阶迭代器更适合该任务,使用.each可能是代码气味。什么是Ruby中的高阶迭代器?

编辑:JörgWMittag,我提到的StackOverflow答案的作者提到他打算编写更高级别的迭代器,但他也解释了什么非常好。

5 个答案:

答案 0 :(得分:23)

答案 1 :(得分:5)

他们谈论的是更专业的方法,例如mapfilterinject。例如,而不是:

even_numbers = []
numbers.each {|num| even_numbers << num if num.even?}

你应该这样做:

even_numbers = numbers.select {|num| num.even?}

它说你想要做什么但是在select方法中封装了所有不相关的技术细节。 (顺便说一下,在Ruby 1.8.7或更高版本中,你可以只写even_numbers = numbers.select(&:even?),所以如果稍微像Perl一样更简洁。)

这些通常不被称为“高阶迭代器”,但无论谁写的那些可能只是一个小的精神混淆。无论您使用什么术语,这都是一个很好的原则。

答案 2 :(得分:3)

从“高阶”的通常定义我会说高阶迭代器是一个迭代器,它将迭代器作为参数或返回迭代器。所以像enum_for这样的东西也许。但是我不认为这就是这个人的意思。

我认为这个人意味着像mapselect这样的迭代器是高阶函数,但没有意识到each当然也是一个高阶函数。所以基本上这只是术语混淆的一个例子。

海报的重点可能是,在eachmapselect可以自然使用的情况下,您不应该使用inject。为了说明这一点,他使用的是一个术语,在这种情况下并没有真正意义。

答案 3 :(得分:0)

我得到了这个问题,所以我在博客上写了最常用的迭代器:select和reject。在帖子中有一些例子,其中'each'被错误地使用,以及如何纠正代码以使用'select'或'reject'。无论如何,我希望它有所帮助。

http://www.natontesting.com/2011/01/01/rubys-each-select-and-reject-methods/

答案 4 :(得分:-1)

我刚写了一篇与这个问题非常相关的博客 - 你想要使用高阶函数的原因是,这样做可以将程序员提升到更高的抽象层次,从而可以以声明的方式表达问题,将实现推送到Ruby标准库或更低级别的代码。

http://www.railstutors.com/blog/declarative-thinking-with-higher-order-functions-and-blocks#.UG5x6fl26jJ