разница между методом класса, методом экземпляра, переменной экземпляра, переменной класса?

Я недавно начал изучать рубин. Я запутался между методами класса, методами экземпляра, переменными экземпляра и переменными класса. Я много гуглил, но не получил никаких разъяснений по этому поводу. Любая помощь вместе с примерами будет оценена по достоинству.


person robert williams    schedule 06.10.2016    source источник
comment
Хм. Когда я гуглю что-то вроде ruby, что такое переменная экземпляра, я вижу массу соответствующей информации.   -  person orde    schedule 06.10.2016
comment
Возможный дубликат переменной экземпляра класса Ruby и переменной класса   -  person davidhu    schedule 06.10.2016


Ответы (2)


Сначала взгляните на эту схему:

из книги по метапрограммированию Ruby

Вы можете справедливо сказать, что «obj имеет метод с именем my_method()», что означает, что вы можете вызывать obj.my_method(). Напротив, вы не должны говорить, что «в MyClass есть метод с именем my_method()». Это сбило бы с толку, поскольку подразумевало бы, что вы можете вызывать MyClass.my_method(), как если бы это был метод класса.

Чтобы устранить двусмысленность, вы должны сказать, что my_method() является методом экземпляра (а не просто «методом») MyClass, что означает, что он определен в MyClass, и вам действительно нужен экземпляр MyClass для назови это. Это тот же метод, но когда вы говорите о классе, вы называете его методом экземпляра, а когда вы говорите об объекте, вы просто называете его методом. Помните об этом различии, и вы не запутаетесь, когда будете писать интроспективный код следующим образом:

String.instance_methods == "abc".methods # => true String.methods == "abc".methods # => false

переменные экземпляра объекта живут в самом объекте, а методы объекта живут в классе объекта. Вот почему объекты одного и того же класса имеют общие методы, но не общие переменные экземпляра.

person Community    schedule 06.10.2016
comment
Вы также можете взглянуть на этот ответ: stackoverflow.com/a/23423950/6296901 - person ; 06.10.2016

Я запутался между методами класса, методами экземпляра,

В Ruby нет такого понятия, как «метод класса». Существует ровно один вид методов: методы экземпляра.

Рубисты иногда говорят о "методах класса", но это просто удобное название, которое мы используем для обозначения "методов экземпляра одноэлементного класса экземпляра класса Class". Это довольно многословно, поэтому мы будем сокращать его до «методы класса», но мы прекрасно знаем, что методов класса не существует в языке Ruby.

переменные экземпляра и переменные класса.

На самом деле разница в том, что написано на банке: переменные экземпляра принадлежат объектам (также известным как экземпляры), тогда как переменные класса принадлежат классам. На самом деле переменные класса имеют довольно широкую область применения: переменная класса видна внутри класса, в котором она определена, во всех своих экземплярах, во всех своих подклассах, во всех экземплярах своих подклассов, во всех подклассах своих подклассов, во всех экземплярах всех его подклассы подклассы и так далее и тому подобное. По сути, переменные класса видны во всей подиерархии классов и во всех прямых и косвенных экземплярах.

Обратите внимание, что классы являются такими же объектами, как и любые другие, они также являются экземплярами (класса Class). Это означает, что они могут иметь переменные экземпляра, как и все другие объекты. В 99% случаев, когда вы думаете, что вам нужна переменная класса, на самом деле вам нужна переменная экземпляра класса.

person Jörg W Mittag    schedule 06.10.2016