if args.size == 5
value_for,alt_currency_id,amount,exchange_rate_code,tran_dt = args
else
value_for,alt_currency_id,amount,exchange_rate_code,year_no,period_no = args
end
任何更好的方式来写这个条件??
答案 0 :(得分:3)
我会完全跳过这个条件。如果您没有第五个参数,period_no
将只是nil
。
如果需要将period_no设置为某个默认值,您可以跟进:
period_no ||= sane_default
答案 1 :(得分:2)
为了严格满足您的要求,我会这样做:
value_for, alt_currency_id, amount, exchange_rate_code = args.shift(4)
tran_dt, year_no, period_no = [nil, nil, nil] # or some sensible defaults
case args.size
when 1 then tran_dt = args.shift
when 2 then year_no, period_no = args.shift(2)
end
但是这段代码有一股气味。我将重新设计如何调用该方法。
答案 2 :(得分:2)
绝对是一种代码气味,特别是因为该变量被称为args
。如果您将所有这些参数作为可选值传递,最好的方法是将变量参数变为散列。
def whatever(value_for, alt_currency_id, amount, options = {})
tran_dt = options[:tran_dt]
year_no = options[:year_no]
period_no = options[:period_no]
...
end
答案 3 :(得分:1)
默认情况下,可能会将period_no
分配给nil
,并使用它来确定您正在使用的参数集:
def process_record(value_for, alt_currency_id, amount, exchange_rate_code, tran_dt, period_no=nil)
year_no = period_no ? tran_dt : nil
puts "tran_dt: #{tran_dt.inspect}"
puts "year_no: #{year_no.inspect}"
puts "period_no: #{period_no.inspect}"
end
process_record(:foo, :bar, :baz, :buz, Time.now)
# Output:
#
# tran_dt: Mon Sep 13 15:52:54 -0400 2010
# year_no: nil
# period_no: nil
process_record(:foo, :bar, :baz, :buz, 2010, 1)
# Output:
#
# tran_dt: 2010
# year_no: 2010
# period_no: 1
答案 4 :(得分:1)
以下是DRYing代码的一种方法:
value_for, alt_currency_id, amount, exchange_rate_code, year_no, period_no = args
if period_no.nil?
tran_dt = year_no
year_no = nil # May or may not be needed, depending on later code
end
答案 5 :(得分:0)
Ruby有两个三元运算符,我知道
a = true ? 'a' : 'b' #=> "a"
b = false ? 'a' : 'b' #=> "b"
或
a = (true && 'a') || b #=> "a"
b = (false && 'a') || b #=> "b"
答案 6 :(得分:0)
你在处理命令行吗?只是保持原样,对我来说,它最初看起来是最可读的:)否则它可能闻到perlish。 您只需查看为5个参数设置的内容即可。 如果这些不是命令行参数,我建议引入哈希。