我经常遇到一种情况,我想做一些条件逻辑,然后返回一部分条件。如何在不重复真或假表达式中的条件部分的情况下执行此操作?
例如:
ClassName.method.blank? ? false : ClassName.method
有没有办法避免重复ClassName.method
?
这是一个真实的例子:
PROFESSIONAL_ROLES.key(self.professional_role).nil? ?
948460516 : PROFESSIONAL_ROLES.key(self.professional_role)
答案 0 :(得分:10)
假设您false
的处理方式与nil
相同,则可以使用||
:
PROFESSIONAL_ROLES.key(self.professional_role) || 948460516
如果948460516
返回key
或nil
,则会返回false
,否则会返回key
的回复值。
请注意,如果key
返回nil
或false
,则仅返回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
变量,则可以重复使用已存在的内容,例如$_
。