Comments 26
Статья неплохая, но совсем не раскрыта особенности объектов типа Symbol
Например:
a = :test
b = :test
a.equal?(b) => true
Например:
a = :test
b = :test
a.equal?(b) => true
+1
верно, спасибо. но вы как раз и раскрыли все, что нужно сказать о равенстве символов в 3 строках кода. тем более я не знаю, есть ли вообще необходимость их сравнивать или проверять на равенство.
0
Я бы еще добавил, что именно поэтому не рекомендуется злоупотреблять символами там где это не надо. Ну по есть например преобразовывать строки в символы в адских циклах. Потому что символы не удаляются из памяти. Кстати, это по прежнему так?
0
> puts /p*cock/ === 'peacock' #true
Какие в Ruby интересные регулярные выражения. Во всех других языках шаблону p*cock будет соответствовать pppcock.
Какие в Ruby интересные регулярные выражения. Во всех других языках шаблону p*cock будет соответствовать pppcock.
0
Если для начинающих, то надо было бы начинать с различных методов присваивания… меня в ступор вводили записи ||= и |= и т.п. (-:
+1
Он определен у класса 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"
+1
Из документации:
о классе 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).
0
>should never be overridden by subclasses
значит что это не стоит делать, но возможность такое сделать имеется.
значит что это не стоит делать, но возможность такое сделать имеется.
+4
Мои примеры кажутся вам не убедительными?
«should never be overridden by subclasses» переводится как «не должен быть переопределён в подклассе». Не может не тоже самое что не должен. В руби можно переопределить любые методы, но переопределение некоторых может поломать поведение многих объектов. Метод equal? как раз такой.
Утверждая, что что-то не может быть переопределено, вы говорите, что в объектной модели руби есть какие-то магические исключения, которых там на самом деле нет.
«should never be overridden by subclasses» переводится как «не должен быть переопределён в подклассе». Не может не тоже самое что не должен. В руби можно переопределить любые методы, но переопределение некоторых может поломать поведение многих объектов. Метод equal? как раз такой.
Утверждая, что что-то не может быть переопределено, вы говорите, что в объектной модели руби есть какие-то магические исключения, которых там на самом деле нет.
+2
Полагаю, незаслуженно обойдён вниманием ценный оператор "===", который, с одной стороны, определён как проверка принадлежности классу в классе 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
+2
=== — это не совсем проверка принадлежности классу.
Функция проверяет принадлежность не только классу, но и принадлежит ли объект потомку этого класса. То есть
это все вернет true. То есть то же самое, что делает kinf_of?()
Для проверки принадлежности классу используется instance_of?()
Функция проверяет принадлежность не только классу, но и принадлежит ли объект потомку этого класса. То есть
Numeric === 42
Integer === 42
Fixnum === 42
это все вернет true. То есть то же самое, что делает kinf_of?()
Для проверки принадлежности классу используется instance_of?()
+1
Да, вообще не раскрыт оператор ===. Вот банальным гуглением нашел пример из более подробной статьи.
Да и ничего не сказано про =~.
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
Да и ничего не сказано про =~.
+2
Использовали бы лучше в статье <source lang="ruby">…<source>
+1
«same_obj = obj1»
По-моему, в этом месте опечатка
По-моему, в этом месте опечатка
0
Sign up to leave a comment.
Равенство в Ruby