Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby what';s self.method与类内方法的区别<&书信电报;自己 class-Foo def self.1;1端 类别[“二”,“一”]_Ruby - Fatal编程技术网

在ruby what';s self.method与类内方法的区别<&书信电报;自己 class-Foo def self.1;1端 类别[“二”,“一”]

在ruby what';s self.method与类内方法的区别<&书信电报;自己 class-Foo def self.1;1端 类别[“二”,“一”],ruby,Ruby,我被告知上述方法“一”和“二”在概念上是不同的,但我不知道如何。 它们都是单例方法-在概念和应用上有什么区别?在应用上没有区别。在概念上,区别是微妙的,但在第一种情况下,您在当前上下文中操作,并在另一个类实例上定义一个方法(实际上,在其特征类中定义一个实例方法),而在第二种情况下,您输入的是另一个类实例的元类(“特征类”)的上下文,然后定义一个实例方法 编辑: 我应该补充一点,选择类的原因我强烈建议您阅读“元编程Ruby”。 这本书解释了Ruby的对象模型,包括单例方法和单例类 本文也解释了同

我被告知上述方法“一”和“二”在概念上是不同的,但我不知道如何。
它们都是单例方法-在概念和应用上有什么区别?

在应用上没有区别。在概念上,区别是微妙的,但在第一种情况下,您在当前上下文中操作,并在另一个类实例上定义一个方法(实际上,在其特征类中定义一个实例方法),而在第二种情况下,您输入的是另一个类实例的元类(“特征类”)的上下文,然后定义一个实例方法

编辑:


我应该补充一点,选择
类的原因我强烈建议您阅读“元编程Ruby”。
这本书解释了Ruby的对象模型,包括单例方法和单例类

本文也解释了同样的主题


+1。模块功能如何?我也很想知道这两者之间的区别。实际上,我从你发送的链接中得到了我的代码片段,因为在那篇文章之后我仍然感到困惑。摘录“虽然一些面向对象语言的类结构既支持实例方法又支持类方法(有时称为静态方法),但Ruby只支持实例方法。如果Ruby只支持实例方法,那么您创建的所有类方法最终会出现在哪里?为什么,当然是单例类。”对我来说,这意味着self.method是相同的-即它们都是singletonsRuby只支持实例方法,但类也是类的实例。当您向一个实例(包括类实例,也就是说,一个类)添加方法时,您实际上是在将实例的类更改为一个新的匿名子类,然后向该子类添加一个新的实例方法。这个匿名子类经常被称为特征类。
class Foo

  def self.one; 1 end

  class << self
    def two; 2 end
  end

end
puts Foo.singleton_methods.inspect # => ["two", "one"]