29

我试图表达这样的条件:

if 33.75 < degree <= 56.25
  # some code
end

但是 Ruby 给出了这个错误:

undefined method `<=' for true:TrueClass

我猜想这样做的一种方法是:

if 33.75 < degree and degree <= 56.25
  # code
end

但是没有其他更简单的方法吗?

4

7 回答 7

88

Ruby 也有 between?:

if value.between?(lower, higher) 
于 2013-09-03T15:40:23.833 回答
11

在 Ruby 中有很多方法可以做同样的事情。您可以使用以下方法检查值是否在范围内,

14.between?(10,20) # true

(10..20).member?(14) # true

(10..20).include?(14) # true

但是,我建议使用betweenthan member?or include?你可以在这里找到更多关于它的信息。

于 2013-09-03T17:44:52.423 回答
7

可以表示a <= x <= b为 as(a..b).include? xa <= x < bas (a...b).include? x

>> (33.75..56.25).include? 33.9
=> true
>> (33.75..56.25).include? 56.25
=> true
>>
>> (33.75..56.25).include? 56.55
=> false

不幸的是,似乎没有这样的事情a < x <= b,, a < x < b..

更新

您可以使用(-56.25...-33.75).include? -degree. 但很难阅读。所以我推荐你使用33.75 < degree and degree <= 56.25.

于 2013-09-03T15:40:20.207 回答
2

usebetween?是最简单的方法,我发现这里的大多数答案都没有提到(ruby doc 解释也很难理解), usingbetween?确实包含minandmax值。

例如:

irb(main):001:0> 2.between?(1, 3)
=> true
irb(main):002:0> 3.between?(1, 3)
=> true
irb(main):003:0> 1.between?(1, 3)
=> true
irb(main):004:0> 0.between?(1, 3)
=> false

顺便说一句,ruby doc 引用:

between?(min, max) → true 或 false 如果 obj <=> min 小于零或 anObject <=> max 大于零,则返回 false,否则返回 true。

于 2017-02-01T10:20:49.880 回答
1
  undefined method `<=' for true:TrueClass

意味着 Ruby 没有按照您期望的方式解析您的 if 条件。

使用&&和添加括号有帮助!

 if (33.75<degree) && (degree<=56.25)
   ...
 end

省略括号是一个坏习惯——一旦表达式变得更加困难,你就会得到一个令人惊讶的结果。我在其他人的代码中看到过很多次。

在 Ruby 中使用and代替是一个非常糟糕的主意,请参阅:&&

https://www.tinfoilsecurity.com/blog/ruby-demystified-and-vs

http://rubyinrails.com/2014/01/30/difference-between-and-and-in-ruby/

于 2013-09-03T15:46:25.807 回答
0

你也可以使用这个符号:

(1..5) === 3           # => true
(1..5) === 6           # => false
于 2021-04-12T11:21:22.033 回答
0

将值调整到范围?

value = 99 
[[value,0].max, 5].min # 5

value = -99
[[value,0].max, 5].min # 0

value = 3
[[value,0].max, 5].min # 3
于 2018-08-07T19:07:57.740 回答