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

时间:2015-12-30 16:02:25

标签: 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

我正在努力确保某个年龄范围之间的树提供x个橙子,但是我仍然坚持使用以下错误来引用我的elsif声明:

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

我也试过使用if大于&&如果没有条件陈述,请有人解释一下这个错误意味着什么,以及如何达到我的解决方案。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

问题在于使用范围说出==的行。

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

如果你这样做了

if ( 10.between?(1, 11))
    puts "true"
end

答案 2 :(得分:4)

您应该使用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

==

  

仅当obj是Range,具有等效的begin和end时才返回true   项目(通过将它们与==进行比较),并具有相同的exclude_end?   设置为范围。

显然情况并非如此。