Ruby def`self.function`名称是什么意思?

Ruby def`self.function`名称是什么意思?,ruby,Ruby,有人能给我解释一下在方法定义中添加self的含义吗?它与java中的this关键字类似吗 当声明一个方法时,声明的self是声明类/模块,因此您实际上是在定义一个类方法。对于客户机,其工作原理类似于java中的静态方法。客户端将对类而不是实例调用该方法:MyClass.method 您可以找到有关类和实例方法的更多详细信息 编辑:虽然self关键字类似于java中的this关键字,但在类方法声明中使用self的效果类似于在java中使用static关键字的效果。相似之处在于,java中的静态方法

有人能给我解释一下在方法定义中添加
self
的含义吗?它与java中的
this
关键字类似吗

当声明一个方法时,声明的
self
是声明类/模块,因此您实际上是在定义一个类方法。对于客户机,其工作原理类似于java中的
静态
方法。客户端将对类而不是实例调用该方法:
MyClass.method

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

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


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

在ruby self中类似于java中的
这个
,但在类中,它更像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)它们与实例无关。在Ruby中,所有的方法都是动态的,所有的方法都与一个实例相关联。事实上,与Java中有三种不同的“方法”(实例方法、静态方法和构造函数)不同,Ruby中只有一种方法:实例方法。因此,答案是否定的:Java中的静态方法与Ruby中的方法完全不同一小时前,Jörg W Mittag


与其他语言不同,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
您可以创建
(*)的实例。在类定义中,Ruby将self设置为这个类的新实例,该实例已被分配给常量A。因此
def self.c_method
相当于
def cat.speak
,也就是说,您定义了一个附加到对象self的单例方法,该对象当前是类A

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

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

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

它完全不像
静态的
。特别是,这些方法是动态的,而不是静态的。@JörgWMittag:它至少在某种意义上类似于Java的
static
——它适用于类级别而不是实例级别。@JörgWMittag-是一个相当强的术语,表示具有明显相似性(当然也有差异)的东西。我已经添加了一些信息来澄清我的观点。@kostja我认为在本文中,Java中的
静态
指的是静态绑定(即调用哪个方法是在编译时确定的),而不是动态绑定,动态绑定用于实例方法。因此,从这个意义上讲,它确实代表了动态的反面,但事实上,关键字static有大量不实用的重载含义,特别是在C中。是的,我的第一个错误是说“在Java中类似于static”。我只关心方法绑定。然后讨论失去了控制:)现在已经改变了最初的措辞。它完全不像
静态的
。特别是,这些方法是动态的,而不是静态的;公共静态无效方法Java中的静态方法有两个不同的特性,使它们不同于实例方法:a)它们是静态的,b)它们与实例不关联。在Ruby中,所有的方法都是动态的,所有的方法都与一个实例相关联。事实上,与Java中有三种不同的“方法”(实例方法、静态方法和构造函数)不同,Ruby中只有一种方法:实例方法。所以,答案是否定的:Java中的静态方法与Ruby中的方法完全不同。这是正确的答案。的确,经验丰富的Ruby开发者有时会使用术语“类方法”来表示“类对象的单例类的实例方法”,但他们只是在充分理解Ruby中不存在类方法这一概念的情况下使用这种简写。(事实上,也没有“单例方法”这样的东西:单例方法只是在对象的单例类中定义的常规方法。)然而,OP显然不是一个有经验的Rubyist,因此将他与速记混淆不是一个好主意。竖起大拇指!当提到模块而不是类时,这个意思会改变吗?