Более изящный способ сделать это в Ruby

Я запустил с Ruby, и нахожу новые, более короткие, изящные способы каждый день писать код.

В решении Euler проблем Проекта я написал много кода как

if best_score < current_score
  best_score = current_score
end

Существует ли более изящный способ записать это?

8
задан alain.janinm 30 April 2012 в 21:00
поделиться

8 ответов

best_score = [best_score, current_score].max

см .: Enumerable. max


отказ от ответственности: хотя это немного более читабельно (imho), оно менее производительно:

require 'benchmark'

best_score, current_score, n = 1000, 2000, 100_000

Benchmark.bm do |x|
  x.report { n.times do best_score = [best_score, current_score].max end }
  x.report { n.times do 
    best_score = current_score if best_score < current_score 
  end }
end

приведет к (с ruby ​​1.8.6 (2008-08-11 patchlevel 287)):

    user     system      total        real
0.160000   0.000000   0.160000 (  0.160333)
0.030000   0.000000   0.030000 (  0.030578)
16
ответ дан 5 December 2019 в 04:49
поделиться

Это можно сделать в одной строке:

best_score = current_score if best_score < current_score
15
ответ дан 5 December 2019 в 04:49
поделиться

Может быть, однострочный?

best_score = current_score if best_score < current_score
6
ответ дан 5 December 2019 в 04:49
поделиться

Это достаточно элегантно. Его легко читать и легко поддерживать.

Если вы хотите короче, вы можете ввести:

best_score = current_score if best_score < current_score

или

best_score = current_score unless best_score >= current_score

... но это не обязательно улучшение во всех случаях (помните о удобочитаемости).

2
ответ дан 5 December 2019 в 04:49
поделиться

Поскольку я не вижу этого выше, я склоняюсь к этому использованию тернарного оператора :

best_score = current_score > best_score ? current_score : best_score

, а также к этой, менее часто встречающейся версии:

best_score = (best_score > current_score && best_score) || current_score

... который труднее читать, но показывает (для меня) несколько неожиданный побочный эффект короткого замыкания. (См. это сообщение в блоге .)

1
ответ дан 5 December 2019 в 04:49
поделиться

Или так

(current_score > best_score) ? best_score = current_score : best_score
0
ответ дан 5 December 2019 в 04:49
поделиться

Выглядит прекрасно, как и вы. Я бы только изменил сравнение так, чтобы оно выглядело так:

Если текущая оценка больше, чем лучшая оценка

Вы также можете создать метод и вызвать его. Для меня это больше ООП.

 def get_best_score() 
      current_score > best_score ?
          current_score :
          best_score
 end

Не в этом ли смысл ООП? Удерживайте состояние объекта.

best_score = get_best_score()
0
ответ дан 5 December 2019 в 04:49
поделиться

Не уверен, что это можно квалифицировать как «более элегантный», но если вы не хотите каждый раз переписывать if ...

def max(b,c)
 if (b < c)
  c
 else
  b
 end
end

best = 10 
current = 20
best = max(best,current)
0
ответ дан 5 December 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: