-1
class Airplane
  attr_reader :weight, :aircraft_type
  attr_accessor :speed, :altitude, :course

  def initialize(aircraft_type, options = {})
    @aircraft_type  = aircraft_type.to_s 
    @course = options[:course.to_s + "%"] || rand(1...360).to_s + "%" 
  end 

如何使用initialize从 1 到 360 的散列的最小和最大允许值?

例子:

airplane1 = Airplane.new("Boeing 74", course: 200)
p radar1.airplanes
=> [#<Airplane:0x000000023dfc78 @aircraft_type="Boeing 74", @course="200%"]

但是,如果我将课程值设置为 370,则飞机 1 不应该工作

4

3 回答 3

1

我认为你的意思是你不想让人们通过类似的东西,如果它是无效{course: '9000%'}options,你想出错。如果是这种情况,您可以测试它是否在范围内:

def initialize(aircraft_type, options = {})
  @aircraft_type  = aircraft_type.to_s 
  allowed_range = 1...360
  passed_course = options[:course]
  @course = case passed_course
    when nil
      "#{rand allowed_range}%"
    when allowed_range
      "#{passed_course}%"
    else 
      raise ArgumentError, "Invalid course: #{passed_course}"
  end
end 
于 2012-05-24T18:27:00.927 回答
1

我敢肯定这可以重构,但这就是我想出的

class Plane

  attr_reader :weight, :aircraft_type
  attr_accessor :speed, :altitude, :course

  def initialize(aircraft_type, options = {})
    @aircraft_type = aircraft_type.to_s 
    @course = options[:course] || random_course
    check_course  
  end

  def check_course
   if @course < 1 or @course > 360
      @course = 1
      puts "Invalid course. Set min"
     elsif @course > 360
      @course = 360
      puts "Invalid course. Set max"
     else
      @course = @course
     end
   end

   def random_course
    @course = rand(1..360)
   end

end
于 2012-05-24T18:33:30.330 回答
1

course是一个角度,不是吗?它不应该是它0...360的有效范围吗?为什么最后的“%”?为什么使用字符串而不是整数?

无论如何,这就是我要写的:

@course = ((options[:course] || rand(360)) % 360).to_s + "%"
于 2012-05-24T18:34:31.470 回答