2012-05-24 15 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 

Как я могу использовать минимальные и максимально допустимые значения для хэша в initialize от 1 до 360?Минимальные и максимальные значения для инициализации хеша

Пример:

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

yep, я хочу: курс с указанным диапазоном значений, если это не так - было бы здорово автоматически вставить максимальное значение – 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' поддерживает диапазоны. Я уверен, что это новая версия. Поскольку ОП использовал его, я предположил, что было безопасным предположением, что его Ruby был последним. И вы правы в отношении типа ошибки. Спасибо за это. – Chuck

+1

Да, это вещь 1.9.3, и я использовал 1.9.2. Это будет для меня не RTFM. –

1

course является угол, ISN Не так ли? не должно быть 0...360 действительный диапазон для этого? и почему последний «%»? и зачем работать со строкой вместо целого?

Во всяком случае, это то, что я написал бы:

@course = ((options[:course] || rand(360)) % 360).to_s + "%" 
Смежные вопросы