#ruby
Как работает self? Понял что метод self передает ссылку на сам себя, а вот в каких случаях использовать self а в каких нет я не понял...
Ответы
Ответ 1
Ruby - полностью объектно-ориентированный язык. В любой момент времени вы действуете в рамках какого-то объекта, даже если все выглядит так, что вы работаете вне объекта. В языке нет функций и процедур в привычном понимании, только методы, причем метод не может вызываться без получателя, т.е. объекта. self - это ссылка на текущий объект. Для обращений к элементам интанс-объекта не обязательно указывать self, так как он подразумевается по умолчанию, но иногда он нужен. Например, при создании методов класса class MyClass def hello p 'hello' end end o = MyClass.new o.hello # MyClass.hello - ошибка Однако class MyClass def self.hello p 'hello' end end MyClass.hello o = MyClass.new # o.hello - ошибка Это не единственный случай, когда вы не сможете обойтись без self, однако чтобы всех их осветить потребуется небольшая книга. При работе с self главное помнить, что это ссылка на текущий объект и что такой объект всегда существует, даже когда вы работаете в корневой области видимости self => mainОтвет 2
В другом ответе допущено несколько ошибок: Для объявления метода класса вы "сможете обойтись без self", если вместо def self. напишете def MyClass. self указывает не всегда на "текущий объект", а скорей на объект, в контексте которого интерпретатор выполняет блок кода Более близок к нужному ответу был @D-side. Если есть локальная переменная под тем же именем, что и метод, происходит затенение, и для подсказки интерпретатору, что мы хотим именно метод, можно приписать self. слева, но и тут есть другой способ -- приписать () справа. Здесь иллюстрации и методы борьбы с такой "проблемой": https://www.sitepoint.com/understanding-scope-in-ruby/Ответ 3
Вставлю свои 5 копеек ) self в контексте метода def some_method self.some_other_method # это self в контексте метода, он обращается к объекту # в отношении которого вызван метод someobj.some_method # т.е. self == someobj end def self.some_class_method #это self в контексте класса он обращается к классу # т.е определяется метод класса который можно вызывать # используя имя класса SomeClass.some_class_method() # т.е. self == SomeClass
end p.s я вижу это так ) Если не прав исправляйте..
Комментариев нет:
Отправить комментарий