Comments 26
Статья неплохая, но совсем не раскрыта особенности объектов типа Symbol
Например:
a = :test
b = :test
a.equal?(b) => true
Например:
a = :test
b = :test
a.equal?(b) => true
верно, спасибо. но вы как раз и раскрыли все, что нужно сказать о равенстве символов в 3 строках кода. тем более я не знаю, есть ли вообще необходимость их сравнивать или проверять на равенство.
Я бы еще добавил, что именно поэтому не рекомендуется злоупотреблять символами там где это не надо. Ну по есть например преобразовывать строки в символы в адских циклах. Потому что символы не удаляются из памяти. Кстати, это по прежнему так?
> puts /p*cock/ === 'peacock' #true
Какие в Ruby интересные регулярные выражения. Во всех других языках шаблону p*cock будет соответствовать pppcock.
Какие в Ruby интересные регулярные выражения. Во всех других языках шаблону p*cock будет соответствовать pppcock.
Если для начинающих, то надо было бы начинать с различных методов присваивания… меня в ступор вводили записи ||= и |= и т.п. (-:
Он определен у класса Object и не может быть переписан в дочерних классах.Это не так, любой метод может быть переопредлён. Это можно проверить:
class Foo
def equal?(other)
"fuu"
end
end
a = Foo.new
a.equal? "test" #=> "fuu"
<source>
Главное понимать к чему такое переопределение может привести.
Более того, вы можете переопределить метод equal? и у класса Object. Правда это поломает руби.
<source lang=ruby>class Object
def equal? other
"broken ruby"
end
end
1.equal? 1 #=> "broken ruby"
Из документации:
о классе Object
Unlike ==, the equal? method should never be overridden by subclasses: it is used to determine object identity (that is, a.equal?(b) iff a is the same object as b).
о классе Object
Unlike ==, the equal? method should never be overridden by subclasses: it is used to determine object identity (that is, a.equal?(b) iff a is the same object as b).
>should never be overridden by subclasses
значит что это не стоит делать, но возможность такое сделать имеется.
значит что это не стоит делать, но возможность такое сделать имеется.
Мои примеры кажутся вам не убедительными?
«should never be overridden by subclasses» переводится как «не должен быть переопределён в подклассе». Не может не тоже самое что не должен. В руби можно переопределить любые методы, но переопределение некоторых может поломать поведение многих объектов. Метод equal? как раз такой.
Утверждая, что что-то не может быть переопределено, вы говорите, что в объектной модели руби есть какие-то магические исключения, которых там на самом деле нет.
«should never be overridden by subclasses» переводится как «не должен быть переопределён в подклассе». Не может не тоже самое что не должен. В руби можно переопределить любые методы, но переопределение некоторых может поломать поведение многих объектов. Метод equal? как раз такой.
Утверждая, что что-то не может быть переопределено, вы говорите, что в объектной модели руби есть какие-то магические исключения, которых там на самом деле нет.
Полагаю, незаслуженно обойдён вниманием ценный оператор "===", который, с одной стороны, определён как проверка принадлежности классу в классе Object:
и с другой, как было справедливо отмечено, позволяет развлекаться с оператором case:
String === 'a'
Fixnum === 42
FalseClass === false
Array === [42]
Hash === {всё_такое: 42}
# это всё вернёт true
и с другой, как было справедливо отмечено, позволяет развлекаться с оператором case:
case a
when /foo/ then ...
when 'bar' then ...
when String then ...
when nil then ...
else ....
end
=== — это не совсем проверка принадлежности классу.
Функция проверяет принадлежность не только классу, но и принадлежит ли объект потомку этого класса. То есть
это все вернет true. То есть то же самое, что делает kinf_of?()
Для проверки принадлежности классу используется instance_of?()
Функция проверяет принадлежность не только классу, но и принадлежит ли объект потомку этого класса. То есть
Numeric === 42
Integer === 42
Fixnum === 42
это все вернет true. То есть то же самое, что делает kinf_of?()
Для проверки принадлежности классу используется instance_of?()
Да, вообще не раскрыт оператор ===. Вот банальным гуглением нашел пример из более подробной статьи.
Да и ничего не сказано про =~.
a = Object.new
a === a # true
a === Object.new # false
"foo" === "foo" # true
"foo".object_id == "foo".object_id # false
1 === 1.0 # true
1.class == 1.0.class # false
Fixnum === 1 # true
(1..10) === 5 # true
/o/ === 'foo' # true
Да и ничего не сказано про =~.
Использовали бы лучше в статье <source lang="ruby">…<source>
«same_obj = obj1»
По-моему, в этом месте опечатка
По-моему, в этом месте опечатка
Sign up to leave a comment.
Равенство в Ruby