def`self.function`这个名字是什么意思?

时间:2012-12-04 15:34:15

标签: ruby

有人可以向我解释在方法定义中添加self的重要性吗?它与java中的this关键字类似吗?

3 个答案:

答案 0 :(得分:76)

与其他语言相反,Ruby没有类方法,但它具有附加到特定对象的单例方法。

cat = String.new("cat")
def cat.speak
    'miaow'
end
cat.speak #=> "miaow" 
cat.singleton_methods #=> ["speak"] 

def cat.speak创建了一个附加到对象cat的单例方法。

当您撰写class A时,它等同于A = Class.new

A = Class.new
def A.speak
    "I'm class A"
end
A.speak #=> "I'm class A" 
A.singleton_methods #=> ["speak"] 

def A.speak创建了一个附加到对象A的单例方法。我们用它来称它为A类的类方法。

写作时

class A
    def self.c_method
        'in A#c_method'
    end
end

您创建了Class(*)的实例。在类定义中,Ruby将self设置为这个新的Class实例,该实例已分配给常量A.因此def self.c_method等同于def cat.speak,也就是说你定义了一个附加到的单例方法对象self,目前是A类。

现在A类有两个单例方法,我们通常称之为类方法。

A.singleton_methods
 => ["c_method", "speak"] 

(*)从技术上讲,在这种情况下,A已经由A = Class.new创建,class A重新打开现有的类。这就是为什么我们最后有两个单例方法。但在通常情况下,它是类的第一个定义,它意味着Class.new。

答案 1 :(得分:42)

在ruby中,self有点类似于java中的this,但是当涉及到类时,它更像是java中的关键字static。一个简短的例子:

class A 
  # class method 
  def self.c_method
    true
  end
  # instance method
  def i_method
    true
  end
end

A.c_method #=> true
A.i_method #=> failure
A.new.i_method #=> true
A.new.c_method #=> failure

更新: java中的静态方法与ruby中的类方法之间的区别

  

Java中的静态方法有两个不同的特性,使它们与实例方法不同:a)它们是静态的,b)它们不与实例相关联。 (IOW:它们真的不像方法,它们只是程序。)在Ruby中,所有方法都是动态的,并且所有方法都与实例相关联。事实上,与Java有三种不同的“方法”(实例方法,静态方法和构造函数)不同,Ruby中只有一种方法:实例方法。所以,不,Java中的静态方法与Ruby中的方法完全不同。 - JörgWMittag 1小时前

答案 2 :(得分:8)

声明方法时,声明的self是声明类/模块,所以有效地定义了一个类方法。对于客户端,这与java中的static方法类似。客户端将调用该类上的方法而不是实例:MyClass.method

Here您可以找到有关类和实例方法的更多详细信息。

编辑:虽然self关键字类似于java中的this关键字,但使用self进行类方法声明的效果类似于使用{{1 java中的关键字。相似之处在于,使用类对象iself而不是类的实例来访问java中的静态方法,如ruby中的类方法。

请注意static不代表动态的反面。选择此关键字的名称是有问题的(可能是从C继承而来),而应该被称为static或类似,以更好地反映其含义。技术含义是每个类加载器只存在一次perClass个成员。