web-dev-qa-db-ja.com

他の2つの値の間に値が含まれているかどうかを確認するにはどうすればよいですか?

私はこのような状態を表現しようとしています:

if 33.75 < degree <= 56.25
  # some code
end

しかしRubyはこのエラーを出します:

undefined method `<=' for true:TrueClass

それを行う1つの方法は次のようなものだと思います:

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

しかし、他にもっと簡単な方法はありませんか?

22
Marc Pursals

Rubyもその間にありますか?:

if value.between?(lower, higher) 
73
nimrodp

Rubyで同じことを行う方法はたくさんあります。以下の方法を使用して、値が範囲内にあるかどうかを確認できます。

14.between?(10,20) # true

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

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

ただし、member?またはinclude?よりもbetweenを使用することをお勧めします。あなたはそれについてもっと知ることができます ここ

9
Akshay Mohite

a <= x <= b(a..b).include? xとして、a <= x < b(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 <= ba < x < b、..にはそのようなことはないようです。

[〜#〜]更新[〜#〜]

(-56.25...-33.75).include? -degreeを使用して実行できます。しかし、それは読みにくいです。したがって、33.75 < degree and degree <= 56.25を使用することをお勧めします。

6
falsetru

使用する between?が最も簡単な方法です。ここではほとんどの回答で言及されていないことがわかりました(Rubyドキュメントの説明も理解しにくい)between?minmaxの値を含みます。

例えば:

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 quote:

between?(min、max)→trueまたはfalse obj <=> minがゼロより小さい場合、またはanObject <=> maxがゼロより大きい場合はfalse、それ以外の場合はtrueを返します。

2
GMsoF
  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/

1
Tilo

範囲に値を調整しますか?

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

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

value = 3
[[value,0].max, 5].min # 3
0
Abel