Min&初始化哈希的最大值

时间:2012-05-24 18:09:32

标签: ruby

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,则plane1不应该工作

3 个答案:

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

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

答案 2 :(得分:1)

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

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

@course = ((options[:course] || rand(360)) % 360).to_s + "%"