while switch operator one multiple estructura else conditions begin ruby condition

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/