2016-10-06 7 views
1

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

+1

Huh. Когда я google что-то вроде «ruby, что такое переменная экземпляра», я вижу тонны соответствующей информации. – orde

+2

Возможная дубликация переменной экземпляра класса Ruby vs. переменной класса (http://stackoverflow.com/questions/15773552/ruby-class-instance-variable-vs-class-variable) – davidhu2000

ответ

1

Сначала посмотрите на этой диаграмме:

from "Metaprogramming Ruby" book

Вы можете справедливо сказать, что «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 

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

+0

Вы также можете взглянуть на это ответ: http://stackoverflow.com/a/23423950/6296901 – Capt

+0

@Carpetsmoker Спасибо за редактирование. – Capt

1

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

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

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

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

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

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

Смежные вопросы