简体   繁体   English

Ruby 在方法中传递参数以调用另一个 class

[英]Ruby pass params in method to call another class

I've got a ruby method:我有一个 ruby 方法:

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

Which I want to expand to call different method than builder from TotalSumBuilder.我想扩展它以调用与来自 TotalSumBuilder 的builder不同的方法。 My goal is to be like:我的目标是:

  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 and TotalSumBuilder.new.expenses_sum will be triggered by the call method. TotalSumBuilder.new.TotalSumBuilder.new.expenses_sumTotalSumBuilder.new.expenses_sum将由 call 方法触发。

If I leave like it is at the top I'm getting an error:如果我像在顶部一样离开,我会收到一个错误:

SystemStackError (stack level too deep):

In your code example first thig that comes to mind is just to reuse TotalSumBuilder instance:在您的代码示例中,首先想到的就是重用 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

but if for some reason you cannot do that - you can use blocks:但如果由于某种原因你不能这样做 - 你可以使用块:

  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 }

or finally, use send :或者最后,使用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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM