类方法,实例方法,实例变量,类变量之间的区别?

时间:2016-10-06 18:40:46

标签: ruby instance-variables class-variables

我最近开始学习红宝石。我在类方法,实例方法,实例变量和类变量之间感到困惑。我google了很多,但我没有得到任何澄清。任何帮助以及示例将不胜感激。

2 个答案:

答案 0 :(得分:2)

首先看一下这个图表:

from "Metaprogramming Ruby" book

你可以正确地说“ obj 有一个名为my_method()的方法,”这意味着你可以调用obj.my_method()。相比之下,你不应该说“MyClass有一个名为my_method()的方法。”这会让人感到困惑,因为这意味着你可以调用MyClass.my_method(),就像它是一个类方法一样。 / p>

要消除歧义,你应该说my_method()是MyClass 的实例方法(不仅仅是“方法”),这意味着它是在MyClass中定义的,而你实际上需要一个实例MyClass称之为。它是相同的方法,但当你谈论类时,你称之为实例方法,当你谈论对象时,你只需将其称为方法。记住这种区别,在写这样的内省代码时你不会感到困惑:

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

对象的实例变量存在于对象本身中,对象的方法存在于对象的类中。这就是为什么同一个类的对象共享方法但不共享实例变量的原因。

答案 1 :(得分:1)

  

我在类方法,实例方法,

之间感到困惑

Ruby中没有“类方法”这样的东西。只有一种方法:实例方法。

Rubyists有时会谈论关于“类方法”,但这只是一个方便的名称,我们用来引用“Class类实例的单例类的实例方法”。这是非常令人满意的,所以我们将它缩写为“类方法”,但我们完全清楚Ruby语言中不存在类方法。

  

实例变量和类变量。

实际上,它的区别几乎就是它所说的:实例变量属于对象(又称实例),而类变量属于类。实际上,类变量的范围非常广泛:类变量在它定义的类中是可见的,它的所有实例,它的所有子类,它的子类的所有实例,它的所有子类的子类,所有的实例都是它的子类的子类等依此类推。基本上,类变量在整个类子层次结构以及所有直接和间接实例中都是可见的。

请注意,类是任何其他类的对象,它们也是实例(Class类)。这意味着他们也可以拥有实例变量,就像所有其他对象一样。 99%的情况下,当你认为你想要一个类变量时,你实际上想要一个类的实例变量。