8

我经常遇到这样的情况,我想做一些条件逻辑,然后返回部分条件。如何在不重复真假表达式中的条件部分的情况下做到这一点?

例如:

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

有什么办法可以避免重复ClassName.method吗?

这是一个真实的例子:

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

3 回答 3

10

假设您可以false接受与 相同的对待nil,您可以使用||

PROFESSIONAL_ROLES.key(self.professional_role) || 948460516

如果返回or948460516则返回,否则返回调用的返回值。keynilfalsekey

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

于 2011-01-07T22:27:34.247 回答
2

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

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

我通常对这类事情使用临时变量。

于 2011-01-07T22:51:07.597 回答
0

I know this doesn't look too pretty, but it does make things a bit DRYer.

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

If you don't want to create temp variable for whatever reason, you could reuse something that already exists like $_.

于 2011-01-07T22:40:58.273 回答