Ruby 一行或有条件且无检查

Ruby One Line Or Conditional with Nil Checks

在 Ruby 中,我想用一个 or 语句做一个单行条件,该语句对 nil 进行了多次检查。例如:

warn = my_val >= max if max or my_val <= min if min

max and/or min 可能为零,所以我只想在一个或两个值存在时进行比较。有没有办法在一行中完成这种类型的逻辑?

这应该有效:

warn = my_val >= max or my_val <= min unless max.nil? and min.nil?

这是一个可能的解决方案:

warn = !my_val.between? (min || -Float::INFINITY), (max || Float::INFINITY)

评论上下文的旧错误解决方案

# warn = max ? my_val >= max :  ( min ? my_val <= min : false ) 

我真的不认为有人会为了 its try 这样一个简单的任务而加入 ActiveSupport,但我不能不建议这样做。它让我想起了旧的 "jQuery way of solving everything" 并且看起来几乎可以阅读。

warn = max.try(:>=, my_val) || min.try(:<=, my_val)

以防万一还不够清楚:不要为此引入 ActiveSupport,除非您已经在使用它(在 Rails 中或出于任何其他原因)。但是,如果您喜欢可读性,可以添加 ActiveSupport 并且只需要 active_support/core_ext/object/try 以获得最小的内存占用。

假设如下:

> max = 3;  min = 0; my_val = 0; 

@PardeepDhingra 的回答似乎是正确的。

> warn = (max && my_val >= max) || (min && my_val <= min)
=> true

@ThomasHaratyk 接受的答案在这种情况下似乎存在逻辑缺陷:

> warn = max ? my_val >= max :  ( min ? my_val <= min : false )
=> false
warn = (max and my_val >= max) or (min and my_val <= min)

既然不能用我原来的答案,我来试试真人的:

def doit(min, max, my_value)
  case [min.nil?, max.nil?]
  when [false, false] then my_value <= min || my_value >= max
  when [false, true ] then my_value <= min
  when [true,  false] then my_value >= max
  when [true,  true ] then false
  end
end

doit 5,7,8     #=> true 
doit 5,7,4     #=> true 
doit 5,7,6     #=> false 
doit nil,7,8   #=> true 
doit 5,nil,4   #=> true 
doit 5,nil,8   #=> false 
doit nil,nil,4 #=> false