如果ruby中的语句似乎只给出了else结果

时间:2018-02-06 01:14:00

标签: ruby if-statement

如标题中所述,无论我设置为输入的结果如何,它总是给出其他结果,这意味着F. 我花了一些时间寻找原因,但我无法弄清楚。 我习惯使用Java作为一种语言而且我刚刚开始使用ruby,因此我尝试相应地编写我在Java中所知道的代码,这可能是错误。

class Test
  @g1
  @g2
  @g3
  @avg
  @grade
  def initialize(g, gg, ggg)
    @g1 = g
    @g2 = gg
    @g3 = ggg
  end

  def setAVG
    @avg = (@g1.to_f + @g2.to_f + @g3.to_f)/3.0
  end

  def getScore
    if @avg.to_f >= 90 and @avg.to_f <= 100
      @grade = 'A'
    elsif @avg.to_f >= 80 and @avg.to_f <= 89
        @grade = 'B'
    elsif @avg.to_f >= 70 and @avg.to_f <= 79
      @grade = 'C'
    elsif @avg.to_f >= 60 and @avg.to_f <= 69
      @grade = 'D'
    else
      @grade = 'F'
    end

    @grade

  end

end

puts 'Enter g1'
gr1 = gets()

puts 'Enter g2'
gr2 = gets()

puts 'Enter g3'
gr3 = gets()

gradesArr = [gr1, gr2, gr3]

for g in 0..gradesArr.length
  if gradesArr[g].to_f <0 or gradesArr[g].to_f > 100
    puts "Reset program with correction at the #{g+1} grade"
    abort
  end
end

grObj = Test.new(gr1,gr2,gr3);

puts "YOUR GRADE IS:  #{grObj.getScore}     #{grObj.setAVG}"

也可以随意告诉我这些是否是ruby标准,例如,我知道在java中你通常输入一个get方法的返回值,但是在ruby中,你只需要编写变量。

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

这是一个更简单的课程,你可以实现:

class Test

  attr_accessor :scores

  def initialize(*scores)
    @scores = scores
  end

  def average
    scores.sum / scores.size
  end

  def grade
    case average
    when 90..100 then "A"
    when 80...90 then "B"
    when 70...80 then "C"
    when 50...70 then "D"
    when 0...50  then "F"
    end
  end
end

用法:

t = Test.new(78, 88, 92)
t.average #=> 86
t.grade #=> "B"

提示:

  • 使用attr_accessor对类变量进行读/写访问
  • 仅存储您需要保存的内容
  • 利用case语句而不是长if/else语句

注意:对于Ruby版本&lt; 2.4,使用scores.reduce(:+)代替scores.sum