Ruby一行或有条件的Nil检查

时间:2015-05-29 14:50:45

标签: ruby null conditional

在Ruby中,我想用一个或多个带有多个nil检查的语句来做一个有条件的行。例如:

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

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

6 个答案:

答案 0 :(得分:4)

warn = (max and my_val >= max) or (min and my_val <= min)

答案 1 :(得分:2)

假设如下:

> 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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

这应该有效:

var strText       = 'a<p>&nbsp; &nbsp;&nbsp;</p>c<p>&nbsp; &nbsp;&nbsp;</p>d<p>&nbsp;aa &nbsp;&nbsp;</p>e',
    div           = document.createElement('div'),
    div.innerHTML = strText,
    p             = div.getElementsByTagName('p');

var empty_paragraph_count = 0;
for(var i=0, n=p.length; i<n; i++){
  if( /^\s*$/.test( p[i].textContent ) ){
    empty_paragraph_count++;
  }
}

答案 4 :(得分:0)

我并不认真考虑任何人只为its try提供ActiveSupport来完成这么简单的任务,但我无法提出建议。它让我想起了解决所有问题的旧的&#34; jQuery方法。看起来几乎可读。

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

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

答案 5 :(得分:0)

由于我无法使用原来的答案,让我尝试一下现实生活中的答案:

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