我对以下想法是否正确?非常感谢建议/反馈!
我们可以通过查看方法名称之前是否已指定关键字self
来判断哪种方法是实例方法,哪种方法是类方法。
因此,该方法,例如:def self.foo_bar
被定义为类方法。
另一方面,def foo_bar
被定义为实例方法。
答案 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对象的本征类的实例方法。