[英]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_sum
和TotalSumBuilder.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.