英文:
Ruby method to compose Enumerator with function
问题
如果你有一个枚举器和一些可调用对象(proc/lambda/method),有时将它们组合以创建一个新的枚举器会很方便,就像这样:
```ruby
class Enumerator
def compose func
Enumerator.new do |yielder|
each { |x| yielder << func[x] }
end
end
end
# 创建一个枚举器,产生0、2、4、6...
(0..10).each.compose(proc { |x| x * 2 })
是否没有内置方法可以做到这一点?或者没有更简单的语法?我一直在查阅文档,因为我们有Enumerator::+和Proc::<<,它们接近但不完全正确。
<details>
<summary>英文:</summary>
If you have an enumerator and some callable (proc/lambda/method) it is sometimes handy to compose them to create a new enumerator, like this
```ruby
class Enumerator
def compose func
Enumerator.new do |yielder|
each { |x| yielder << func[x] }
end
end
end
# make an enumerator that yields 0, 2, 4, 6...
(0..10).each.compose(proc { |x| x * 2 })
Is there no built-in method for doing this? Or no simpler syntax? I've been trawling the docs because we have Enumerator::+ and Proc::<< which are close but not quite right.
答案1
得分: 4
这听起来像 Enumerable#map
方法:
(0..10).each.map { |x| x * 2 }
事实上,你甚至不需要 each
,因为 map
是混入了 Enumerable
的任何对象上的方法:
(0..10).map { |x| x * 2 }
如果你想要获得一个惰性枚举器,你可以在应用任何转换之前调用 Enumerable#lazy
。这将返回一个对象,可以对其应用所有的 Enumerable
方法以惰性方式执行:
(0..10).lazy.map { |x| x * 2 }
英文:
That sounds like Enumerable#map
(0..10).each.map { |x| x * 2 }
In fact, you don't even need the each
, since map
is a method on anything that mixes in Enumerable
.
(0..10).map { |x| x * 2 }
If you want to get a lazy enumerator, you can call Enumerable#lazy
before applying any transformations. This returns an object on which all of the Enumerable
methods can be applied lazily.
(0..10).lazy.map { |x| x * 2 }
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论