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