如果条件在红宝石中写的更好的方法

时间:2010-09-13 18:54:37

标签: ruby-on-rails ruby

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

任何更好的方式来写这个条件??

7 个答案:

答案 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个参数设置的内容即可。 如果这些不是命令行参数,我建议引入哈希。