DRY up Ruby ternary - PullRequest
       37

DRY up Ruby ternary

8 голосов
/ 08 января 2011

У меня часто бывает ситуация, когда я хочу выполнить некоторую условную логику, а затем вернуть часть условия.Как я могу сделать это, не повторяя часть условия в выражении true или false?

Например:

ClassName.method.blank? ? false : ClassName.method

Есть ли способ избежать повторения ClassName.method?

Вот пример из реальной жизни:

PROFESSIONAL_ROLES.key(self.professional_role).nil? ? 
    948460516 : PROFESSIONAL_ROLES.key(self.professional_role)

Ответы [ 3 ]

10 голосов
/ 08 января 2011

Если вы согласны с тем, что с false обращаются так же, как с nil, вы используете ||:

PROFESSIONAL_ROLES.key(self.professional_role) || 948460516

Возвращается 948460516, если key возвращает nil или false, а возвращаемое значение вызова key в противном случае.

Обратите внимание, что это вернет 948460516, только если key вернет nil или false, а не если вернет пустой массив или строку. Поскольку вы использовали nil? во втором примере, я думаю, что все в порядке. Однако вы использовали blank? в первом примере (а blank? возвращает true для пустых массивов и строк), поэтому я не уверен.

1 голос
/ 08 января 2011

Если вы просто хотите СУХОЙ, вы можете использовать временную переменную:

x = ClassName.method
x.blank? ? false : x

x = PROFESSIONAL_ROLES.key(self.professional_role)
x.nil? ? 948460516 : x

Если вы не хотите использовать временную переменную, вы можете использовать блок:

Proc.new do |x| x.blank? ? false : x end.call(ClassName.method)
Proc.new do |x| x.nil? ? 948460516 : x end.call(PROFESSIONAL_ROLES.key(self.professional_role))

Для описываемых вами случаев (когда вы просто хотите использовать исходное значение при сбое проверки по умолчанию), было бы просто написать вспомогательный метод:

def x_or_default(x, defval, checker = :nil?)
  if x.send(checker) then defval else x end
end
x_or_default(ClassName.method, false, :blank?)
x_or_default(PROFESSIONAL_ROLES.key(self.professional_role), 94840516)

, который очень похож на описанный метод ||, но также будет работать с вашим примером blank?.

Я обычно использую временные переменные для такого рода вещей.

0 голосов
/ 08 января 2011

Я знаю, что это выглядит не слишком красиво, но это делает вещи немного СУХИМИ.то, что уже существует, как $_.

...