【问题标题】:Listen to lazy enumerable听懒枚举
【发布时间】: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


    【解决方案1】:

    如果您想将处理器应用于值,以便一次发送一个

    class A
      def initialize(*processors)
        @processors = processors
      end
      def call(list)
        list.inject(0) do |acc, item|
          acc + @processors.map { |processor| processor.call(item) }.inject(:+)
        end
      end
    end
    
    class B
      def initialize(multiplier)
        @multiplier = multiplier
      end
    
      def call(item)
        puts "B with multipler: #{@multiplier}, adding: #{item}"
        item * @multiplier
      end
    end
    
    p A.new(B.new(1), B.new(2)).call([1, 2, 3, 4, 5].lazy)
    

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2015-08-08
      相关资源
      最近更新 更多