Лучший способ установить значения по умолчанию? - PullRequest
2 голосов
/ 05 ноября 2010

Можем ли мы сделать следующий код Ruby короче и в то же время более читабельным?

height = do_some_calc
height = 128 if height == 0

Ответы [ 6 ]

7 голосов
/ 05 ноября 2010
height = 128 if 0 == height = do_some_calc

Это единственный способ, который я знаю, если do_some_calc должен оцениваться только один раз.

2 голосов
/ 05 ноября 2010

Если вы хотите изменить do_some_calc, чтобы вернуть false или ноль вместо 0, то вы в деле.

height = do_some_calc || 128

Если вы не можете изменить do_some_calc, чтобы он возвращал false или nil, когда он обычно возвращает 0, тогда вы можете обернуть его, но в долгосрочной перспективе вы не сохраняете много символов.За исключением случая, когда у вас есть много мест, где вы устанавливаете значения по умолчанию.

Эта оболочка вернет false, если do_some_calc вернет 0 и вывод do_some_calc во всех других случаях.

def my_do_some_calc
   temp = do_some_calc 
   temp != 0 && temp
end

Собрав все вместе, вы получите:

height = my_do_some_calc || 128
1 голос
/ 05 ноября 2010

Более короткие?Не и быть функциональным.

  height = (h = do_some_calc).zero? ? 128 : h 

как в:

def do_some_calc
  rand 100
end

10.times do 
  height = (h = do_some_calc).zero? ? 128 : h 
  puts height
end
# >> 3
# >> 95
# >> 89
# >> 82
# >> 31
# >> 4
# >> 82
# >> 99
# >> 11
# >> 64
0 голосов
/ 05 ноября 2010

Технически, если не очень читабельно, это технически короче:

(height = do_some_call) == 0 and height = 128

Я бы сказал, оставь это так, как есть, твой путь кажется наиболее кратким и читабельным.

0 голосов
/ 05 ноября 2010

Вы можете сделать следующим образом

height = do_some_calc.zero? ? 128 : do_some_calc 
0 голосов
/ 05 ноября 2010

Может быть, что-то вроде:

STANDARD_HEIGHT = 128
def do_some_calc
  height = 0
  #calculate our height...
  height = height == 0 ? STANDARD_HEIGHT : calculated_height
end

Я думаю, что нужно больше контекста, заданного для 128, следовательно, константа.Я также думаю, что do_some_calc должен скрывать тот факт, что если он равен 0, он действительно должен равняться нашему DEFAULT_HEIGHT.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш подразумеваемый вопрос (который я редактировал как таковой), мыможно сделать его короче, увеличив do_some_calc.

...