干掉Ruby三元组

时间:2011-01-07 22:25:25

标签: ruby conditional ternary-operator

我经常遇到一种情况,我想做一些条件逻辑,然后返回一部分条件。如何在不重复真或假表达式中的条件部分的情况下执行此操作?

例如:

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

有没有办法避免重复ClassName.method

这是一个真实的例子:

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

3 个答案:

答案 0 :(得分:10)

假设您false的处理方式与nil相同,则可以使用||

PROFESSIONAL_ROLES.key(self.professional_role) || 948460516

如果948460516返回keynil,则会返回false,否则会返回key的回复值。

请注意,如果key返回nilfalse,则仅返回948460516,而不是返回空数组或字符串。由于您在第二个示例中使用了nil?,我认为没关系。但是,您在第一个示例中使用了blank?blank?为空数组和字符串返回true,所以我不确定。

答案 1 :(得分:1)

如果您只想干,那么您可以使用临时变量:

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?示例。

我通常会将临时变量用于此类事情。

答案 2 :(得分:0)

我知道这看起来不太漂亮,但确实让事情变得干脆。

a = "ABC"
b = (temp = a.downcase).length < 3 ? "---" : temp

如果您因任何原因不想创建temp变量,则可以重复使用已存在的内容,例如$_