所有类方法都是用“def self.foo”定义的吗?

时间:2011-11-08 05:28:27

标签: ruby oop class-method

我对以下想法是否正确?非常感谢建议/反馈!


我们可以通过查看方法名称之前是否已指定关键字self来判断哪种方法是实例方法,哪种方法是类方法。

因此,该方法,例如:def self.foo_bar被定义为类方法。 另一方面,def foo_bar被定义为实例方法。

3 个答案:

答案 0 :(得分:4)

不,你不能这样做。考虑一下:

class C
  class << self
    def m
      puts 'pancakes!'
    end
  end
  def i
    puts 'eggs'
  end
end

m上为您提供了一个类方法C,方法声明中没有“self”。但是,您可以向班级询问其方法:

C.methods.include? :m
# true
C.methods.include? :i
# false
C.instance_methods.include? :i
# true

考虑到Ruby的类是多么可变,要求课程是唯一确定的方法。

答案 1 :(得分:1)

除了在类定义中使用self.的方法之外,还有更多方法可以定义类方法:

class A
  def A.method1
  end

  class << self
    def method2
    end
  end
end

A.instance_eval do
  def method3
  end
end

module B
  def method4
  end
end

A.extend B

p A.methods.first(4)

# >> [:method1, :method2, :method3, :method4]

答案 2 :(得分:0)

作为另一种选择,您可以借助此代码段看到所有类方法:

class C
  class << self
    def first
    end
  end
  def C.second
  end
  def self.third
  end
end

eigenclass = class << C; self; end
eigenclass.instance_methods(false)  # => [:first, :second, :third]

那是因为所有类方法都是这个Class'es对象的本征类的实例方法。