Я недавно начал изучать рубин. Я запутался между методами класса, методами экземпляра, переменными экземпляра и переменными класса. Я много гуглил, но не получил никаких разъяснений по этому поводу. Любая помощь вместе с примерами будет оценена по достоинству.
разница между методом класса, методом экземпляра, переменной экземпляра, переменной класса?
Ответы (2)
Сначала взгляните на эту схему:
Вы можете справедливо сказать, что «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
переменные экземпляра объекта живут в самом объекте, а методы объекта живут в классе объекта. Вот почему объекты одного и того же класса имеют общие методы, но не общие переменные экземпляра.
Я запутался между методами класса, методами экземпляра,
В Ruby нет такого понятия, как «метод класса». Существует ровно один вид методов: методы экземпляра.
Рубисты иногда говорят о "методах класса", но это просто удобное название, которое мы используем для обозначения "методов экземпляра одноэлементного класса экземпляра класса Class
". Это довольно многословно, поэтому мы будем сокращать его до «методы класса», но мы прекрасно знаем, что методов класса не существует в языке Ruby.
переменные экземпляра и переменные класса.
На самом деле разница в том, что написано на банке: переменные экземпляра принадлежат объектам (также известным как экземпляры), тогда как переменные класса принадлежат классам. На самом деле переменные класса имеют довольно широкую область применения: переменная класса видна внутри класса, в котором она определена, во всех своих экземплярах, во всех своих подклассах, во всех экземплярах своих подклассов, во всех подклассах своих подклассов, во всех экземплярах всех его подклассы подклассы и так далее и тому подобное. По сути, переменные класса видны во всей подиерархии классов и во всех прямых и косвенных экземплярах.
Обратите внимание, что классы являются такими же объектами, как и любые другие, они также являются экземплярами (класса Class
). Это означает, что они могут иметь переменные экземпляра, как и все другие объекты. В 99% случаев, когда вы думаете, что вам нужна переменная класса, на самом деле вам нужна переменная экземпляра класса.