【发布时间】:2017-02-15 15:19:32
【问题描述】:
我最近开始学习 ruby。我对类方法、实例方法、实例变量和类变量感到困惑。我google了很多,但我没有得到任何澄清。任何帮助以及示例将不胜感激。
【问题讨论】:
-
嗯。当我在谷歌上搜索“ruby 什么是实例变量”之类的内容时,我会看到大量相关信息。
标签: ruby instance-variables class-variables
我最近开始学习 ruby。我对类方法、实例方法、实例变量和类变量感到困惑。我google了很多,但我没有得到任何澄清。任何帮助以及示例将不胜感激。
【问题讨论】:
标签: ruby instance-variables class-variables
我对类方法和实例方法感到困惑,
Ruby 中没有“类方法”这样的东西。方法只有一种:实例方法。
Ruby 主义者有时会谈论“类方法”,但这只是我们用来指代“Class 类实例的单例类的实例方法”的方便名称。说的太多了,所以我们将其缩写为“类方法”,但我们很清楚 Ruby 语言中不存在类方法。
实例变量和类变量。
真的,区别就像它在锡上所说的那样:实例变量属于对象(也称为实例),而类变量属于类。实际上,类变量的范围相当广泛:一个类变量在定义它的类、它的所有实例、它的所有子类、它的所有子类的所有实例、它的所有子类的子类、所有的所有实例中都是可见的。它的子类的子类等等。基本上,类变量通过整个类子层次结构以及所有直接和间接实例都是可见的。
请注意,类与任何其他对象一样是对象,它们也是实例(Class 类)。这意味着它们也可以具有实例变量,就像所有其他对象一样。 99% 的情况下,当你认为你想要一个类变量时,你实际上想要一个类的实例变量。
【讨论】:
先看看这张图:
您可以正确地说“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
对象的实例变量存在于对象本身中,而对象的方法存在于对象的类中。这就是为什么同一个类的对象共享方法但不共享实例变量的原因。
【讨论】: