干掉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
返回nil
或false
,则返回948460516
否则返回key
的返回值。
请注意,如果key
返回nil
或false
,则仅返回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
变量,则可以重用已存在的内容,如$_
。