干掉Ruby三元组

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

例如:

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

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

这是一个现实世界的例子:

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

假设你可以像对待nil一样对待false ,你使用||

 PROFESSIONAL_ROLES.key(self.professional_role) || 948460516 

如果key返回nilfalse ,则返回948460516否则返回key的返回值。

请注意,如果key返回nilfalse ,则仅返回948460516,而不是返回空数组或字符串。 既然你用的是nil? 在你的第二个例子中,我认为没关系。 但你用blank? 在第一个例子中(并且blank?对于空数组和字符串返回true ),所以我不确定。

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

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

我通常使用临时变量来做这种事情。

我知道这看起来不太漂亮,但确实让事情有点干涩。

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

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