следующий отрывок из кода направляющих
def rescue_from(*klasses, &block)
options = klasses.extract_options!
unless options.has_key?(:with)
if block_given?
options[:with] = block
else
raise ArgumentError, "Need a handler. Supply an options hash that has a :with key as the last argument."
end
end
klasses.each do |klass|
key = if klass.is_a?(Class) && klass <= Exception
klass.name
elsif klass.is_a?(String)
klass
else
raise ArgumentError, "#{klass} is neither an Exception nor a String"
end
# put the new handler at the end because the list is read in reverse
self.rescue_handlers += [[key, options[:with]]]
end
end
end
Заметьте оператор <=
что это?
См. http://ruby-doc.org/core/classes/Module.html#M001669 для документации по всем операторам сравнения, открываемым модулями (и, следовательно, классами).
В данном конкретном случае: "Возвращает true, если mod является подклассом other или является тем же самым, что и other. Возвращает nil, если между ними нет никакой связи. (Подумайте об отношениях в терминах определения класса: "класс A < B" подразумевает "A < B")."
. Он сравним с методом is_a?
, который возвращает истину, если класс получателя является подклассом аргумента; рассмотрим:
Fixnum.superclass # => Integer
Fixnum <= Integer # => true
это оператор для "LHS является тем же классом, что и или подклассом RHS". < - это оператор для "LHS является подклассом RHS".
Это странная перегрузка операторов, но обратите внимание, что объявления подклассов в Ruby также используют < , как в
class SomeClass < ActiveRecord::Base
так что, по крайней мере, в этом смысле они последовательны.
(LHS: левая сторона, RHS: правая сторона)
Почти уверен, что это означает, что klass - это тип исключения.
Обычно это означает "меньше или равно". Так что этот код мог бы сказать, что если это хотя бы класс, но не исключение... сделайте что-нибудь. Но тогда архитектура 'less than' была бы неуместна.
Из документации по коду
# Обработчики наследуются. Они ищутся справа налево, от
# снизу вверх и вверх по иерархии. Обработчик первого класса для
# для которого exception.is_a?(klass) имеет значение true, будет вызван, если таковой имеется.