加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby类方法与本体类中的方法

发布时间:2020-12-16 20:28:25 所属栏目:百科 来源:网络整理
导读:该类的本征类(或元类)中的类方法和方法只是定义一个东西的两种方式吗? 否则有什么区别? class X # class method def self.a "a" end # eigenclass method class self def b "b" end endend X.a和X.b的行为方式有所不同吗? 我认识到我可以通过打开特征类来
该类的本征类(或元类)中的类方法和方法只是定义一个东西的两种方式吗?

否则有什么区别?

class X
  # class method
  def self.a
    "a"
  end

  # eigenclass method
  class << self
    def b
      "b"
    end
  end
end

X.a和X.b的行为方式有所不同吗?

我认识到我可以通过打开特征类来覆盖或别名类方法:

irb(main):031:0> class X; def self.a; "a"; end; end
=> nil
irb(main):032:0> class X; class << self; alias_method :b,:a; end; end
=> #<Class:X>
irb(main):033:0> X.a
=> "a"
irb(main):034:0> X.b
=> "a"
irb(main):035:0> class X; class << self; def a; "c"; end; end; end
=> nil
irb(main):036:0> X.a
=> "c"

解决方法

这两种方法是等效的. ‘eigenclass’版本有助于使用attr_ *方法,例如:
class Foo
  @instances = []
  class << self;
    attr_reader :instances
  end
  def initialize
    self.class.instances << self
  end
end

2.times{ Foo.new }
p Foo.instances
#=> [#<Foo:0x2a3f020>,#<Foo:0x2a1a5c0>]

您还可以使用define_singleton_method在类上创建方法:

Foo.define_singleton_method :bim do "bam!" end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读