2017-02-09 4 views
-1

Я создаю объект Лифт с экземпляром, который может проходить только между этажами один и двенадцать. Код работает для методов вверх и вниз, но я не могу заставить лифт не подниматься выше этажа 12 или ниже пола 1. Я пробовал использовать, если @floor> = 12, но была синтаксическая ошибка. Я уверен, что это просто, но я новичок в Ruby.Использование инструкции if или if для переменной экземпляра (Ruby)

Вот код, который работает:

class Elevator 
    @@count = @floor 
    #The Constructor Method 
    def initialize(floor) #floor is an instance variable of the Elevator object. 
    @floor = floor 
    cheery_greeting 
    end 

    def cheery_greeting 
    puts "Hello my friend! would you like to go up or down?" 
    end 

    def self.notify() 
    "You are now on floor #{@@count}" 
    end 

    #accessor methods 
    def go_up 
     @floor += 1 
     notify 
    end 

    def go_down 
     @floor -= 1 
     notify 
    end 

Я хочу, чтобы добавить разрыв так, что он останавливается, когда итерации достигают пола двенадцать, так что я написал, но это даже не ставит.

def floor_limit 
    if @@count == 12 
     puts "You're Way Too High!" 
    end 

Я также попытался:

def go_up 
     unless @floor >= 12  
    @floor += 1 
    notify 
    end 
+1

Я собираюсь предположить, что вы исходите из Python, вы, кажется, исключаете утверждения 'end', чтобы закрыть свои блоки. Обе усилия, о которых вы говорите, вы попробовали, нужно «закончить» для условного и еще один «конец» для определения метода. – pjs

ответ

2

Вы смешиваете переменные экземпляра класса с переменными экземпляра здесь, и это приведет к проблемам и путанице. Если вы новичок в Ruby, я настоятельно рекомендую избегать использования переменных экземпляра класса, они просто приводят к большому беспорядку. Вместо этого сосредоточьтесь на том, чтобы сделать каждый экземпляр максимально самодостаточным.

Чтобы сделать это более рубин вы можете сделать несколько вещей:

class Elevator 
    # Define a valid range for this elevator 
    FLOOR_RANGE_DEFAULT = (1..12) 

    # Expose the current floor and range as properties 
    attr_reader :floor 
    attr_reader :range 

    def initialize(floor, range = nil) 
    @floor = floor.to_i 
    @range = (range || FLOOR_RANGE_DEFAULT).to_a 
    end 

    def inspect 
    @range.map do |floor| 
     if (@floor == floor) 
     '[%d]' % floor 
     else 
     ' %d ' % floor 
     end 
    end.join(' ') 
    end 
end 

Тогда ваш вверх и вниз код могут проверить пределы и отклонять, если это недопустимая операция. Сначала отделить движущуюся код от кода, который интерпретирует вверх или вниз:

def up 
    move(@floor + 1) 
end 

def down 
    move(@floor - 1) 
end 

def move(target) 
    if (@range.include?(target)) 
    @floor = target 
    end 

    @floor 
end 

Теперь у вас есть рамки, которые вы можете построить на. Используя простые вещи, как функция расстояния в Ruby можно сделать очень адаптируемый класс, который может справиться с ситуациями, как лифты, которые имеют другие ограничения:

e = Elevator.new(1, (1..20)) 

Или остановить только на нечетных этажах:

e = Elevator.new(1, (1..20).select(&:odd?)) 

или пропустить 4-й, 13-й и 14-й:

e = Elevator.new(1, (1..20).to_a - [ 4, 13, 14 ]) 

Это не займет больше кода, он просто берет правильный код.

+1

Да, это делает много смысла. Это действительно полезно, поскольку я стараюсь не просто выполнить это одно задание, но и создать общие навыки логики программирования. Я использовал только процедурный код до прошлой недели, но теперь я вижу, насколько полезными и гибкими могут быть объекты. Спасибо за объяснение. –

0

Следующие должны сделать трюк.

def go_up 
    @floor += 1 unless @floor >= 12  
    notify 
end 

Или так:

def go_up 
    @floor += 1 if @floor < 12  
    notify 
end 

Они оба довольно интуитивно, так что до вас.

This - довольно подробное объяснение о том, когда следует использовать unless. И here является стандартным, если/else/за исключением учебника.

+0

Неясно, должно ли условие применяться только к ходу, или к команде move/notify. – pjs

+0

Да, я не был уверен в этом вопросе.Вот почему я добавил дополнительные ресурсы на условные обозначения. –

+0

У меня было неправильное заявление в неправильном месте! Спасибо Джастину. Я знал, что это было что-то простое, что я не замечал. –

Смежные вопросы