web-dev-qa-db-fra.com

Comment vérifier si une valeur est incluse entre deux autres valeurs?

J'essaie d'exprimer une condition comme celle-ci:

if 33.75 < degree <= 56.25
  # some code
end

Mais Ruby donne cette erreur:

undefined method `<=' for true:TrueClass

Je suppose qu’une façon de le faire est quelque chose comme:

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

Mais il n'y a pas d'autre moyen plus facile?

19
Marc Pursals

Ruby a aussi entre ?:

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

Il y a beaucoup de façons de faire la même chose en Ruby. Vous pouvez vérifier si la valeur est dans la plage en utilisant les méthodes suivantes,

14.between?(10,20) # true

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

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

Mais, je suggérerais d'utiliser between que member? ou include?. Vous pouvez trouver plus d'informations à ce sujet ici .

8
Akshay Mohite

Vous pouvez exprimer a <= x <= b en tant que (a..b).include? x et a <= x < b en tant que (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

Malheureusement, cela ne semble pas être le cas pour a < x <= b, a < x < b, ..

METTRE &AGRAVE; JOUR

Vous pouvez accomplir en utilisant (-56.25...-33.75).include? -degree. Mais c'est difficile à lire. Je vous recommande donc d'utiliser 33.75 < degree and degree <= 56.25.

6
falsetru

utiliser between? est le moyen le plus simple. J'ai trouvé la plupart des réponses que je n'ai pas mentionnées (l'explication de doc Ruby est difficile à comprendre également). Utiliser between? n'inclut pas les valeurs min et max.

par exemple:

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

à propos, Ruby doc citation:

between? (min, max) → true ou false Renvoie false si obj <=> min est inférieur à zéro ou si anObject <=> max est supérieur à zéro, true sinon.

2
GMsoF
  undefined method `<=' for true:TrueClass

signifie que Ruby n’analyse pas votre condition if de la façon dont vous l’attendez.

Utiliser && et ajouter des parenthèses aide!

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

C'est une mauvaise habitude de laisser de côté les parenthèses - dès que l'expression devient plus difficile, vous pouvez obtenir un résultat surprenant. Je l'ai souvent vu dans le code des autres.

Utiliser and au lieu de && dans Ruby est un très mauvais idée, voir:

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

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

1
Tilo

Ajuster la valeur à la plage?

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