我正在阅读关于.each
迭代器的Ruby问题,并且有人声称如果高阶迭代器更适合该任务,使用.each
可能是代码气味。什么是Ruby中的高阶迭代器?
编辑:JörgWMittag,我提到的StackOverflow答案的作者提到他打算编写更高级别的级迭代器,但他也解释了什么非常好。
答案 0 :(得分:23)
答案 1 :(得分:5)
他们谈论的是更专业的方法,例如map
,filter
或inject
。例如,而不是:
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
这样的东西也许。但是我不认为这就是这个人的意思。
我认为这个人意味着像map
或select
这样的迭代器是高阶函数,但没有意识到each
当然也是一个高阶函数。所以基本上这只是术语混淆的一个例子。
海报的重点可能是,在each
,map
或select
可以自然使用的情况下,您不应该使用inject
。为了说明这一点,他使用的是一个术语,在这种情况下并没有真正意义。
答案 3 :(得分:0)
我得到了这个问题,所以我在博客上写了最常用的迭代器:select和reject。在帖子中有一些例子,其中'each'被错误地使用,以及如何纠正代码以使用'select'或'reject'。无论如何,我希望它有所帮助。
http://www.natontesting.com/2011/01/01/rubys-each-select-and-reject-methods/
答案 4 :(得分:-1)
我刚写了一篇与这个问题非常相关的博客 - 你想要使用高阶函数的原因是,这样做可以将程序员提升到更高的抽象层次,从而可以以声明的方式表达问题,将实现推送到Ruby标准库或更低级别的代码。