Лучший способ написать, если условие в рубине - PullRequest
1 голос
/ 13 сентября 2010
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 ]

3 голосов
/ 13 сентября 2010

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

Если для period_no необходимо установить какое-то значение по умолчанию, вы можете использовать:

period_no ||= sane_default
2 голосов
/ 14 сентября 2010

Определенно является запахом кода, тем более что переменная называется 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
2 голосов
/ 14 сентября 2010

Чтобы строго соответствовать вашим требованиям, я бы сделал это:

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 голос
/ 14 сентября 2010

Вот один из способов СУШКИ немного увеличить код:

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
1 голос
/ 13 сентября 2010

Возможно присвоить 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
0 голосов
/ 14 сентября 2010

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

0 голосов
/ 13 сентября 2010

В Ruby есть также два троичных оператора, о которых я знаю

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

или

a = (true  && 'a') || b #=> "a"  
b = (false && 'a') || b #=> "b"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...