【发布时间】:2016-10-03 10:28:29
【问题描述】:
我正在尝试构建可以处理事件流的东西。我希望我的处理器没有副作用,因此它们易于管理,但我也想确保我不会在流中运行两次。
class A
def initialize(*processors)
@processors = processors
end
def call(list)
@processors.inject(0) { |acc, p|
acc + p.call(list)
}
end
end
class B
def initialize(multiplier)
@multiplier = multiplier
end
def call(list)
list.map { |i|
i * @multiplier
}.inject(0) { |acc, i|
puts "B with multipler: #{@multiplier}, adding: #{i}"
acc + i
}
end
end
A.new(B.new(1), B.new(2)).call([1, 2, 3, 4, 5].lazy)
# => 45
A 类完全错误,因为执行顺序是:
# B with multipler: 1, adding: 1
# B with multipler: 1, adding: 2
# B with multipler: 1, adding: 3
# B with multipler: 1, adding: 4
# B with multipler: 1, adding: 5
# B with multipler: 2, adding: 2
# B with multipler: 2, adding: 4
# B with multipler: 2, adding: 6
# B with multipler: 2, adding: 8
# B with multipler: 2, adding: 10
我如何修改 A 类来给我一个执行顺序:
# B with multipler: 1, adding: 1
# B with multipler: 2, adding: 2
# B with multipler: 1, adding: 2
# B with multipler: 2, adding: 4
# B with multipler: 1, adding: 3
# B with multipler: 2, adding: 6
# B with multipler: 1, adding: 4
# B with multipler: 2, adding: 8
# B with multipler: 1, adding: 5
# B with multipler: 2, adding: 10
我需要某种更复杂的可枚举类型吗?
【问题讨论】:
标签: ruby lazy-evaluation enumerable