2013-09-03 15 views
17

sto cercando di esprimere una condizione come questa:Come verificare se un valore è incluso tra altri due valori?

if 33.75 < degree <= 56.25 
    # some code 
end 

Ma rubino dà questo errore:

undefined method `<=' for true:TrueClass 

Sto indovinando che un modo per farlo è qualcosa di simile:

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

Ma non esiste un altro modo più semplice?

+1

Un'altra soluzione potrebbe essere quella di utilizzare un intervallo:? '(33.75..56.25) .include (gradi) ' – MrYoshiji

+0

Questo è tipico di praticamente ogni linguaggio di programmazione con solo poche eccezioni. Questo perché molte lingue hanno operatori unari o binari. Ricorda che '33.75 tadman

+0

Quindi preferirei usare &&. (Grazie a toro2k per correggere il mio cattivo inglese;)) –

risposta

50

Ruby ha anche tra ?:

if value.between?(lower, higher) 
+1

Questa dovrebbe essere la risposta selezionata. Questo è esattamente ciò che "tra?" È stato codificato, e credo che le prestazioni saranno più alte (anche se non l'ho confrontato per vedere) – fotanus

+1

Ciao fotanus, hai ragione. Sembra che tra? è fatto per queste situazioni ma sfortunatamente non si adatta esattamente a ciò di cui ho bisogno. Nel limite inferiore ho bisogno di un

6

È possibile esprimere a <= x <= b come (a..b).include? x e a <= x < b come (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 

Purtroppo, non sembra nulla di simile per a < x <= b, a < x < b, ..

UPDATE

È possibile realizzare usando (-56.25...-33.75).include? -degree. Ma è difficile da leggere. Quindi ti consiglio di usare 33.75 < degree and degree <= 56.25.

+0

Quindi la mia unica possibilità è impostare il limite inferiore a 33.76 e usare (33.76..56.25) .include? (Degree) ... –

+0

Questo non è sexy quando hai a che fare con i float ... –

+0

Puoi usare '(- 56.25 ...- 33,75) .include? -degree'. Ma è difficile da leggere. Vi consiglio di usare il semplice '33.75 falsetru

1
undefined method `<=' for true:TrueClass 

significa che Ruby non è l'analisi vostra condizione If il modo in cui ci si aspetta.

Utilizzare && e aggiungere parentesi aiuta!

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

E 'una cattiva abitudine di lasciare fuori parentesi - non appena l'espressione diventa più difficile, si potrebbe ottenere un risultato sorprendente. L'ho visto molte volte nel codice di altre persone.

Utilizzando and invece di && in Ruby è un pessima idea, vedi:

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

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

+0

L'OP ha già fornito quell'idea, senza parentesi, e funziona. Hai appena aggiunto parentesi non necessarie. – sawa

6

Ci sono molti modi di fare le stesse cose in Ruby. È possibile verificare se il valore è nel campo mediante l'uso di metodi riportati di seguito,

14.between?(10,20) # true

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

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

Ma, vi suggerirei di usare between di member? o include?. Potete trovare di più su di esso here.

1

uso between? è il modo più semplice, ho trovato la maggior parte delle risposte qui non ha menzionato (rubino doc spiegazione è difficile da capire anche questo), utilizzando between? include il valore min e max.

ad esempio:

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 

tra l'altro, rubino doc citazione:

between?(min, max) → true or false Returns false if obj <=> min is less than zero or if anObject <=> max is greater than zero, true otherwise.

Problemi correlati