def Summer
    @summer = true
    puts "Your fruit are ripe for the picking."
    if @tree_age == 1..5 && @tree_age > 0
        @oranges = 5
    elsif @tree_age == 6..15
        @oranges = 20
    else
        @oranges = 50
    end
end

Ich versuche sicherzustellen, dass ein Baum zwischen einem bestimmten Altersbereich x Orangen ergibt. Ich habe jedoch den folgenden Fehler, der sich auf meine elsif-Aussage bezieht:

Orange_tree.rb:14: warning: integer literal in conditional range

Ich habe auch versucht, eine Anweisung zu verwenden, die größer als && kleiner als bedingt ist. Kann jemand bitte erklären, was dieser Fehler bedeutet und wie ich zu meiner Lösung komme?

0
Eats Indigo 30 Dez. 2015 im 19:02

3 Antworten

Beste Antwort

Sie sollten include? anstelle von {verwenden. {X1}}, um festzustellen, ob die angegebene Nummer innerhalb des Bereichs liegt:

def Summer
    @summer = true
    puts "Your fruit are ripe for the picking."
    if (1..5).include?(@tree_age) && @tree_age > 0
        @oranges = 5
    elsif (6..15).include? @tree_age
        @oranges = 20
    else
        @oranges = 50
    end
end

==:

Gibt nur dann true zurück, wenn obj ein Bereich ist, äquivalente Anfangs- und Endelemente hat (indem sie mit == verglichen werden) und dasselbe exclude_end hat? Einstellung als Bereich.

Was offensichtlich nicht der Fall ist.

5
idmean 30 Dez. 2015 im 16:14

Sie haben ein paar Probleme:

  • Sie sollten Ihre Bereiche in Klammern setzen, wenn andere Operatoren oder Methoden in der Nähe sind. Ihr aktueller Fehler ist darauf zurückzuführen, dass Ruby elsif @tree_age == 6..15 anders analysiert als erwartet - es wird als (1 == 6)..15 behandelt, und false..15 ergibt offensichtlich keinen Sinn.
  • Verwenden Sie (1..5) === num und nicht num == (1..5), um zu testen, ob eine Zahl innerhalb eines Bereichs liegt. Range#=== ist zum Testen definiert dass das Range die rechte Seite enthält, während { {X4}} und {{X5} } beide testen nur, ob die rechte Seite numerisch äquivalent ist.
  • Sie müssen @tree_age > 0 nicht testen. Sie testen bereits, ob es sich um 1..5 handelt.

Sie können auch eine case - Anweisung in Betracht ziehen, die etwas einfacher zu lesen ist. case führt seine Vergleiche mit === durch.

@oranges = case @tree_age
           when 1..5 then 5
           when 6..15 then 20
           else 50
           end
8
Kristján 31 Dez. 2015 im 21:39

Das Problem liegt in den Zeilen, in denen == mit einem Bereich steht.

if ( 10  == 1..11) # throws integer literal in conditional range warning
    puts "true"
end

Wenn Sie dies stattdessen getan haben

if ( 10.between?(1, 11))
    puts "true"
end
4
inic 30 Dez. 2015 im 16:08