Что <= оператор на Классах Ruby?

следующий отрывок из кода направляющих

  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

Заметьте оператор <=

что это?

8
задан Simone Carletti 9 October 2010 в 21:21
поделиться

4 ответа

См. http://ruby-doc.org/core/classes/Module.html#M001669 для документации по всем операторам сравнения, открываемым модулями (и, следовательно, классами).

В данном конкретном случае: "Возвращает true, если mod является подклассом other или является тем же самым, что и other. Возвращает nil, если между ними нет никакой связи. (Подумайте об отношениях в терминах определения класса: "класс A < B" подразумевает "A < B")."

.
13
ответ дан 5 December 2019 в 07:10
поделиться

Он сравним с методом is_a? , который возвращает истину, если класс получателя является подклассом аргумента; рассмотрим:

Fixnum.superclass # => Integer
Fixnum <= Integer # => true
6
ответ дан 5 December 2019 в 07:10
поделиться

это оператор для "LHS является тем же классом, что и или подклассом RHS". < - это оператор для "LHS является подклассом RHS".

Это странная перегрузка операторов, но обратите внимание, что объявления подклассов в Ruby также используют < , как в

 class SomeClass < ActiveRecord::Base

так что, по крайней мере, в этом смысле они последовательны.

(LHS: левая сторона, RHS: правая сторона)

3
ответ дан 5 December 2019 в 07:10
поделиться

Почти уверен, что это означает, что klass - это тип исключения.

Обычно это означает "меньше или равно". Так что этот код мог бы сказать, что если это хотя бы класс, но не исключение... сделайте что-нибудь. Но тогда архитектура 'less than' была бы неуместна.

Из документации по коду

# Обработчики наследуются. Они ищутся справа налево, от
# снизу вверх и вверх по иерархии. Обработчик первого класса для
# для которого exception.is_a?(klass) имеет значение true, будет вызван, если таковой имеется.

1
ответ дан 5 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: