2015-01-19 3 views
2

Документация строка класса (2.1.1) описывает === оператора как:`Строка # ===` Пример документации

Если obj не является экземпляром String, но реагирует на to_str, затем две строки сравниваются с использованием равенства случаев Object#===.

Я пробовал это в одном примере, но он не работает. Вот как я попробовал:

class Foo 
    def to_str 
    'some_txt' 
    end 
end 

foo = Foo.new 
'some_txt' === foo #=> false 

Я ожидал, что это должно вернуться true. Но это не так. Я спрашиваю, может ли кто-нибудь показать это описание в примере. Что я здесь делаю неправильно?

ответ

4

Если obj не является экземпляром String, а отвечает на to_str, то две строки сравниваются с использованием равенства case Object # ===.

В вашем случае foo отвечает #to_str, но не экземпляр String. Так в 'some_txt' === foo на самом деле использует Object#===

Случай равенства - Для класса Object, фактически то же самое, как вызов #==, но, как правило, переопределяется потомков, чтобы обеспечить осмысленные семантику в случае заявления.

Foo является потомком класса из Object. Любой класс в Ruby по умолчанию наследует от Object. Теперь Foo не переопределил метод #===, поэтому в соответствии с документацией он будет использовать метод Object#==. Документация Object#== говорит:

Равенство - На Object уровне == возвращает истинный только если obj и other являются же объект. Как правило, этот метод переопределяется в классах потомков, чтобы обеспечить значение, специфичное для класса.

В соответствии с вышеуказанным принципа - в качестве 'some_txt' экземпляра String и foo является экземпляром Foo, 'some_txt' === foo (который на самом деле foo == 'some_txt', поскольку Object#=== делегирует вызов в Object#==) дает false.

Документация Object#== и Object#=== как говорит -

Как правило, этот метод переопределяется в классах-потомках, чтобы обеспечить значение класса специфические.

Это означает, что вы можете переопределить либо Object#=== или Object#== реализовать логику сравнений. Просто, чтобы имитировать то, что я только что сказал, я ставлю один фиктивный пример кода: -

class Foo 
    def to_str 
    'some_txt' 
    end 

    def ==(other) 
    true 
    end 
end 

foo = Foo.new 
'some_txt' === foo # => true 
foo.class.superclass # => Object 
+1

Вы могли бы реализовать 'Foo # ==' 'переопределить Object # ==' – Stefan

+0

@Stefan Именно это точка. –

+4

Вероятно, у вас есть правильные рассуждения, но ваш заказ на презентацию не работает логически. Вы хотите показать, что в этом случае '' some_txt '=== foo' использует 'Object # ===' (не 'Object # =='), а затем вы хотите показать, что 'Object # === 'использует' Object # == ', если он не переопределен. – sawa

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