ruby - switch - ¿Cómo verificar si un valor está incluido entre otros dos valores?
switch case ruby string (6)
Ajustar el valor al rango?
value = 99
[[value,0].max, 5].min # 5
value = -99
[[value,0].max, 5].min # 0
value = 3
[[value,0].max, 5].min # 3
Estoy tratando de expresar una condición como esta:
if 33.75 < degree <= 56.25
# some code
end
Pero Ruby da este error:
undefined method `<='' for true:TrueClass
Supongo que una forma de hacerlo es algo como:
if 33.75 < degree and degree <= 56.25
# code
end
¿Pero no hay otra manera más fácil?
Hay muchas maneras de hacer las mismas cosas en Ruby. Puede verificar si el valor está en el rango utilizando los siguientes métodos,
14.between?(10,20) # true
(10..20).member?(14) # true
(10..20).include?(14) # true
Pero, sugeriría usar between
que member?
o include?
. Puedes encontrar más sobre esto here .
Puede expresar a <= x <= b
como (a..b).include? x
(a..b).include? x
y a <= x < b
como (a...b).include? x
(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
Desafortunadamente, no parece haber tal cosa para a < x <= b
, a < x < b
, ..
ACTUALIZAR
Usted puede lograr utilizando (-56.25...-33.75).include? -degree
(-56.25...-33.75).include? -degree
Pero es difícil de leer. Así que te recomiendo que uses 33.75 < degree and degree <= 56.25
.
Ruby también tiene entre ?:
if value.between?(lower, higher)
utilizar between?
es la forma más fácil, encontré que la mayoría de las respuestas aquí no se mencionan (la explicación de ruby doc también es difícil de entender), usando between?
INCLUYE el valor min
y max
.
por ejemplo:
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
por cierto, cita doc ruby:
entre? (min, max) → verdadero o falso Devuelve falso si obj <=> min es menor que cero o si unObject <=> max es mayor que cero, de lo contrario es verdadero.
undefined method `<='' for true:TrueClass
significa que Ruby no está analizando tu condición de "si" de la forma en que lo esperas.
¡Usar &&
y agregar paréntesis ayuda!
if (33.75<degree) && (degree<=56.25)
...
end
Es un mal hábito dejar de lado los paréntesis: tan pronto como la expresión se vuelve más difícil, se puede obtener un resultado sorprendente. He visto esto muchas veces en el código de otras personas.
Usar and
lugar de &&
en Ruby es una muy mala idea, vea:
https://www.tinfoilsecurity.com/blog/ruby-demystified-and-vs
http://rubyinrails.com/2014/01/30/difference-between-and-and-in-ruby/