有人可以向我解释在方法定义中添加self
的重要性吗?它与java中的this
关键字类似吗?
答案 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
个成员。