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?
Ruby a aussi entre ?:
if value.between?(lower, higher)
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 .
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
.
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.
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/
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