设置elsif范围条件时如何避免错误?

Eat*_*igo 0 ruby range

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
Run Code Online (Sandbox Code Playgroud)

我试图确保某个年龄范围之间的树给出了x橙子,但是我仍然坚持使用以下错误来引用我的elsif语句:

Orange_tree.rb:14: warning: integer literal in conditional range
Run Code Online (Sandbox Code Playgroud)

我也试过使用if大于&&小于条件的语句,有人可以解释这个错误的含义,以及如何达到我的解决方案.

Kri*_*ján 8

你有一些问题:

  • 当其他操作符或方法在附近时,您需要将范围放在括号中.您当前的错误来自Ruby解析elsif @tree_age == 6..15与您预期的不同 - 它将其视为(1 == 6)..15,并且false..15显然没有任何意义.
  • 要测试一个数字在一个范围内,请使用(1..5) === num,而不是num == (1..5).Range#===被定义为测试该Range包括右手侧,而Fixnum#==Fixnum#===这两个只是测试的右手侧在数值上相等.
  • 你不需要测试@tree_age > 0.你已经在测试它了1..5.

您还可以考虑使用case此语句,这可能更容易阅读.case使用它进行比较===.

@oranges = case @tree_age
           when 1..5 then 5
           when 6..15 then 20
           else 50
           end
Run Code Online (Sandbox Code Playgroud)


idm*_*ean 5

您应该使用include?而不是==来确定给定的数字是否在范围内:

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
Run Code Online (Sandbox Code Playgroud)

==

仅当 obj 是一个范围,具有等效的开始和结束项(通过将它们与 == 进行比较)并且具有相同的 exclude_end 时才返回 true?设置为范围。

显然情况并非如此。