2012-05-24 88 views
-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 

如何在1到360之間使用initialize中散列的最小和最大允許值?用於初始化散列的最小值和最大值

例子:

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

但如果我設置爲當然值370,airplane1不應該工作

+1

你的問題不是很清楚。什麼是「允許」值?你指的是什麼哈希?你期望什麼樣的散列的最終值得到某些輸入? –

+1

好的,所以你想確保'options [:course]'在一個指定的值範圍內?如果不是,會發生什麼? (「不工作」不是很清楚。) –

+0

是的,我想要:具有指定數值範圍的課程,如果不是 - 會自動插入最大值 – Savroff

回答

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 
+0

適合我嗎?不知道 – Tallboy

+1

'rand'理解一個'Range'參數是一個1.9.3不在1.9.2中的東西。 PS:如果你最終使用隨機課程,你會把你的'%'符號加倍,不是嗎? –

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 
+0

哪個版本的「rand」知道如何處理Range?引發ArgumentError可能比RuntimeError更好。 –

+0

@ muistooshort:1.9.3'rand'支持範圍。我很確定它在該版本中是新的。由於OP使用它,我認爲這是一個安全的假設,以使他的Ruby是最新的。你對錯誤類型是正確的。感謝那。 – Chuck

+1

是的,這是一個1.9.3的東西,我使用的是1.9.2。這將我每個人不RTFM。 –

1

course是一個角度,ISN是嗎?它不應該是0...360它的有效範圍嗎?爲什麼最後的「%」?以及爲什麼要使用字符串而不是整數?

無論如何,這就是我想要寫:

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