我正在学习ruby和ROR,同时注意到别人的代码中有一件事。有时我看到方法在这两种显然略有不同的方式中被定义:
class SomeClass < SomeInheritance::Base
def self.myMethod
end
def myOtherMethod
end
end
它有什么不同吗?我的意思是,在方法定义中使用self
会影响方法以某种方式工作的方式吗?任何启蒙都是受欢迎的。
答案 0 :(得分:21)
def self.method_name
将定义一个类方法而不是实例方法 - 就像
class << self; def foo; end; end
关于这个主题的好帖子是来自Yehuda Katz的this post
例如:
class Foo
def method_1
"called from instance"
end
def self.method_2
"called from class"
end
class << self
def method_3
"also called from class"
end
end
end
> Foo.method_1
NoMethodError: undefined method 'method_1' for Foo:Class
> Foo.method_2
=> "called from class"
> Foo.method_3
=> "also called from class"
> f = Foo.new
=> #<Foo:0x10dfe3a40>
> f.method_1
=> "called from instance"
> f.method_2
NoMethodError: undefined method 'method_2' for #<Foo:0x10dfe3a40>
> f.method_3
NoMethodError: undefined method 'method_3' for #<Foo:0x10dfe3a40>
答案 1 :(得分:1)
如果您尝试此代码:
class SomeClass
p self
end
你会打印出'SomeClass'。那是因为self
引用了SomeClass对象(是的,clases也是Ruby中的对象)。
使用self,你可以定义一个class_method,即一个类对象的方法(虽然它实际上是在对象的元类中定义的......):
class SomeClass
def self.class_method
puts "I'm a class method"
end
def instance_method
puts "I'm an instance method"
end
end
SomeClass.class_method # I'm a class method
有关Ruby对象模型的更多信息。 Dave Thomas就这个问题发表了精彩的演讲 - 请参阅@ Octopus-Paul给你推荐的链接。