0

我有一个红宝石方法:

  def build_total_sum(day)
    TotalSumBuilder.new(
      recurring_expenses: recurring_payments_data,
      expense_contracts: expense_contracts_data,
      day: day
    ).build
  end

我想扩展它以调用与builderTotalSumBuilder 不同的方法。我的目标是:

  def initialize(day)
    @day = day
  end

  def call
    date.map do |day|
      {
        day: day,
        total_sum: build_total_sum(day, build),
        revenues_sum: build_total_sum(day, revenues_sum),
        expenses_sum: build_total_sum(day, revenues_sum)
      }
    end
  end

  def build_total_sum(day, method_name)
    TotalSumBuilder.new(
      recurring_expenses: recurring_payments_data,
      expense_contracts: expense_contracts_data,
      day: day
    ).method_name
  end

TotalSumBuilder.new.TotalSumBuilder.new.expenses_sum并将TotalSumBuilder.new.expenses_sum由 call 方法触发。

如果我像在顶部一样离开,我会收到一个错误:

SystemStackError (stack level too deep):

4

1 回答 1

1

在您的代码示例中,首先想到的就是重用 TotalSumBuilder 实例:

def call
  date.map do |day|
    builder = total_sum_builder(day) # calls TotalSumBuilder.new and returns it
 
    {
      day: day,
      total_sum: builder.build,
      revenues_sum: builder.revenues_sum,
      expenses_sum: builder.expenses_sum
    }
  end
end

def total_sum_builder(day)
    TotalSumBuilder.new(
      recurring_expenses: recurring_payments_data,
      expense_contracts: expense_contracts_data,
      day: day
    )
end

但如果由于某种原因你不能这样做 - 你可以使用块:

  def build_total_sum(day)
    yield TotalSumBuilder.new(
      recurring_expenses: recurring_payments_data,
      expense_contracts: expense_contracts_data,
      day: day
    )
  end

# and then
build_total_sum(day){|builder| builder.revenues_sum }

或者最后,使用send

  def build_total_sum(day, method_name)
    builder = TotalSumBuilder.new(
      recurring_expenses: recurring_payments_data,
      expense_contracts: expense_contracts_data,
      day: day
    )
    raise "unknown method #{method name}" unless builder.respond_to?(method_name)
    builder.send(method_name)
  end

build_total_sum(day, :build)
于 2020-12-01T13:09:30.990 回答