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不应该工作
答案 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 + "%"