2010-09-13 3 views

ответ

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 
0

рубин имеет две тройные операторы, как хорошо, что я в курсе

a = true ? 'a' : 'b' #=> "a" 
b = false ? 'a' : 'b' #=> "b" 

или

a = (true && 'a') || b #=> "a" 
b = (false && 'a') || b #=> "b" 
+0

Второй не является тернарным оператором. Это два бинарных оператора. Не то, чтобы это было очень актуально для исходного вопроса ... –

3

Я бы просто пропустить состояние полностью. Если у вас нет пятого аргумента, period_no будет просто nil.

Если period_no нужно установить какой-то по умолчанию вы можете следить с:

period_no ||= sane_default 
+0

Если у меня есть пять аргументов, чем значение trans_dt будет иметь дату, например, 20100913. И у меня есть более пяти аргументов, чем year_no будет годом, например, 2010. Как это возможно с вашим ответом .. –

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 
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 

Но этот код имеет запах. Я бы посмотрел на пересмотр способа вызова этого метода.

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 
0

обрабатываете вы командная строка? Просто оставьте, как есть, для меня это наиболее читаемо при первом взгляде :) В противном случае он может пахнуть perlish. Вы просто видите, что требуется для 5 аргументов. Если это не аргументы командной строки, я предлагаю ввести хэш.

Смежные вопросы