当前位置:  开发笔记 > 后端 > 正文

红宝石中的单身人士究竟是什么类别?

如何解决《红宝石中的单身人士究竟是什么类别?》经验,为你挑选了3个好方法。

Ruby中的单例类本身就是一个类吗?这就是为什么所有对象都属于"类"的原因吗?这个概念很模糊,但我认为它与为什么我可以在所有(class foo; def foo.bar ...)中定义一个类方法有关.

Ruby中的单例类是什么?



1> Pistos..:

首先,一个小定义:单例方法是仅为单个对象定义的方法.例:

irb(main):001:0> class Foo; def method1; puts 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #
irb(main):003:0> def foo.method2; puts 2; end
=> nil
irb(main):004:0> foo.method1
1
=> nil
irb(main):005:0> foo.method2
2
=> nil
irb(main):006:0> other_foo = Foo.new
=> #
irb(main):007:0> other_foo.method1
1
=> nil
irb(main):008:0> other_foo.method2
NoMethodError: undefined method `method2' for #
        from (irb):8

实例方法是类的方法(即在类的定义中定义).类方法是类Class实例上的单例方法- 它们未在类的定义中定义.相反,它们是在对象的单例类上定义的.

irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false

使用语法打开对象的单例类class << obj.在这里,我们看到这个单例类是定义单例方法的地方:

irb(main):012:0> singleton_class = ( class << foo; self; end )
=> #>
irb(main):013:0> singleton_class.method_defined? :method1
=> true
irb(main):014:0> singleton_class.method_defined? :method2
=> true
irb(main):015:0> other_singleton_class = ( class << other_foo; self; end )
=> #>
irb(main):016:0> other_singleton_class.method_defined? :method1
=> true
irb(main):017:0> other_singleton_class.method_defined? :method2
=> false

因此,向对象添加单例方法的另一种方法是在对象的单例类打开时定义它们:

irb(main):018:0> class << foo; def method3; puts 3; end; end
=> nil
irb(main):019:0> foo.method3
3
=> nil
irb(main):022:0> Foo.method_defined? :method3
=> false

综上所述:

方法必须始终属于一个类(或者:是某些类的实例方法)

普通方法属于它们定义的类(即类的实例方法)

类方法只是a的单例方法 Class

对象的单例方法不是对象类的实例方法; 相反,它们是对象的单例类的实例方法.


在我的墓碑上,它会说"RIP Ruby Singleton.Pistos救了我的理智."

2> Bedasso..:

Ruby提供了一种定义特定于特定对象的方法的方法,这种方法称为Singleton方法.当一个人在一个对象上声明一个单例方法时,Ruby会自动创建一个只保存单例方法的类.新创建的类称为Singleton Class.

    foo = Array.new
    def foo.size
      "Hello World!"
    end
    foo.size  # => "Hello World!"
    foo.class # => Array
    #Create another instance of Array Class and call size method on it
    bar = Array.new
    bar.size  # => 0
Singleton类是特定于对象的匿名类,它自动创建并插入到继承层次结构中.

singleton_methods 可以在对象上调用以获取对象上所有单例方法的名称列表.

    foo.singleton_methods  # => [:size]
    bar.singleton_methods  # => []

这篇文章真的帮助我理解Ruby中的Singleton类,它有一个很好的代码示例.


虽然这个答案已经超过一年了,并且链接很有帮助,但如果您在此网站上发布答案的基本部分,或者您的帖子有被删除的风险会更好[请参阅常见问题解答,其中提到的答案是'勉强不仅仅是一个链接'.](http://stackoverflow.com/faq#deletion)如果您愿意,您仍然可以包含该链接,但仅作为"参考".答案应该独立而不需要链接.

3> Piotr Galas..:

刚刚更新到@Pistos答案,从版本1.9.2 ruby​​添加新语法来获取singleton类

 singleton_class = ( class << foo; self; end )

可以替换为:

singleton_class = foo.singleton_class

https://apidock.com/ruby/Object/singleton_class

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有