干燥 Ruby 三元

发布于 2024-10-11 03:07:05 字数 379 浏览 4 评论 0原文

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

例如:

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

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

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

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

I often have a situation where I want to do some conditional logic and then return a part of the condition. How can I do this without repeating the part of the condition in the true or false expression?

For example:

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

Is there any way to avoid repeating ClassName.method?

Here is a real-world example:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

与风相奔跑 2024-10-18 03:07:05

假设您同意将 false 视为与 nil 相同的方式,则使用 ||

PROFESSIONAL_ROLES.key(self.professional_role) || 948460516

这将返回 948460516 code> 如果 key 返回 nilfalse,否则返回调用 key 的返回值。

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

Assuming you're okay with false being treated the same way as nil, you use ||:

PROFESSIONAL_ROLES.key(self.professional_role) || 948460516

This will return 948460516 if key returns nil or false and the return value of the call to key otherwise.

Note that this will only return 948460516 if key returns nil or false, not if it returns an empty array or string. Since you used nil? in your second example, I assume that's okay. However you used blank? in the first example (and blank? returns true for empty arrays and strings), so I'm not sure.

说不完的你爱 2024-10-18 03:07:05

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

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

我通常使用临时变量来处理这类事情。

If you just want to DRY, then you can use a temp variable:

x = ClassName.method
x.blank? ? false : x

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

If you don't want to use a temp variable, you can use a block:

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))

For the cases you describe (where you just want to use the original value when a default-check fails), it'd be straightforward to write a helper method:

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)

which is very similar to the || method described, but would also work with your blank? example.

I usually use temporary variables for this sort of thing.

油焖大侠 2024-10-18 03:07:05

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

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

如果您出于某种原因不想创建 temp 变量,则可以重用已存在的内容,例如 $_

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 $_.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文