2015-09-20 3 views
2

Я делаю курс «ruby bits» в кодовой школе и немного ненавижу. Задания требуют знания, которое не было освещено в их коротких лекциях, что заставляет меня заниматься Google. Иногда я даже не знаю требуемых поисковых запросов. Может ли кто-нибудь помочь мне понять, что происходит в коде ниже?Синтаксис класса потомка в рубине

class InvalidGameError < StandardError; end 

def new_game(name, options={}) 
    raise InvalidGameError, "You must provide a name for this game." unless name 
    { 
    name: name, 
    year: options[:year], 
    system: options[:system] 
    } 
end 

begin 
    game = new_game(nil) 
rescue InvalidGameError => e 
    puts "There was a problem creating your new game: #{e.message}" 
end 

Я не совсем понимаю, что происходит в первой строке. Также зачем нужно начинать заявление? Разве это не четвертая строка?

+0

редактировал пост – YKY

ответ

3

Первая строка эквивалентна

class InvalidGameError < StandardError 
end 

, который является общим способом Ruby, чтобы определить новое исключение. В этом случае вы определяете исключение InvalidGameError, которое наследуется от StandardError.

Блок begin/rescue/end является Ruby exception handling mechanism.

Если какой-либо InvalidGameError будет поднят во время выполнения кода между begin/rescue, Ruby выполнит любой код после rescue.

begin 
    # do something 
rescue StandardError 
    # do something if the error occurs 
end 
+0

Какая часть код будет выполнен, если я просто наберу new_game (nil) в irb? – YKY

+0

Код будет остановлен в 'raise InvalidGameError', поскольку исключение будет поднято, и выполнение будет продолжено из инструкции' rescue'. Вы должны прочитать ссылку, которую я опубликовал об обработке исключений. –

+0

Нет. Когда возникает исключение, код уже находится внутри начала (поскольку 'new_game' вызывается из начального блока). –

2

Первая строка - это определение нового Исключения, с помощью которого объектно-ориентированные языки программирования обрабатывают ошибки времени выполнения. В этом случае единственная причина, по которой ваш инструктор определяет новые исключения, заключается в том, что когда вы читаете код, вы точно знаете, какая ошибка обрабатывается. Вы могли бы просто использовать StandardError напрямую, но InvalidGameError - лучшее имя для ошибки, которую обрабатывает код. Итак, возьмем код, который вы опубликовали для примера: Метод new_game требует, чтобы пользователь предоставил имя, и если вы попытаетесь вызвать его с именем, которое установлено на nil или false (new_game (nil, {year: 2015, system: «xbox»})) ваш код будет вызывать исключения, которые остановят и выйдут из программы, иначе метод вернет хэш, который имеет три пары: ключ имени с его значением, установленным на имя, которое вы указали в качестве параметра, год ключ с его значением, установленным для ключа года хеша параметров и системного ключа с его значением, установленным на системный ключ хэш-параметров.

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

+0

Да, спасибо. Я уже узнал о хэшах и условностях. Концепция исключений сбивает меня с толку. – YKY

+1

Подумайте об этом как о способе обработки ошибок, которые могут произойти, когда ваш код уже запущен, что вы не можете предсказать, когда они произойдут, но вы знаете, что они могут произойти. например, если вы читаете файл, и вдруг кто-то удаляет файл до того, как вы закончите чтение. Вы можете предсказать, что это может произойти, но вы не могли предсказать, когда когда-либо – Codejunky

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