Ruby中组合Enumerator与可调用对象:是否有内置方法或简洁语法?
Ruby Enumerator与可调用对象组合的内置方案
Ruby标准库中没有直接实现你所描述的compose功能的内置方法,但有更简洁的语法可以达到相同效果:
1. 惰性转换(推荐,保持Enumerator特性)
使用Enumerator#lazy结合map方法,能生成惰性的LazyEnumerator(继承自Enumerator),仅在需要取值时才执行转换逻辑,和你自定义的compose方法行为完全一致:
# 生成0,2,4,6...的惰性Enumerator (0..10).lazy.map { |x| x * 2 }
如果你的可调用对象是独立的proc/lambda,也可以直接传入:
double = proc { |x| x * 2 } (0..10).lazy.map(&double)
2. 非惰性转换(适用于无需延迟求值的场景)
如果不需要惰性特性,可以先通过map生成转换后的数组,再转为Enumerator:
double = proc { |x| x * 2 } (0..10).map(&double).each
注意这种方式会立即遍历原Enumerator生成完整数组,再转为新的Enumerator,性能上不如惰性版本。
你提到的Enumerator::+用于拼接两个Enumerator的元素序列,Proc::<<用于组合多个Proc(将前一个Proc的输出作为后一个的输入),确实和你需求的“将Enumerator每个元素通过可调用对象转换生成新Enumerator”不匹配。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

