`def self.myMethod`和`def myMethod`之间有什么区别吗?

时间:2011-12-16 18:32:12

标签: ruby-on-rails ruby

我正在学习ruby和ROR,同时注意到别人的代码中有一件事。有时我看到方法在这两种显然略有不同的方式中被定义:

class SomeClass < SomeInheritance::Base

  def self.myMethod
  end

  def myOtherMethod
  end

end

它有什么不同吗?我的意思是,在方法定义中使用self会影响方法以某种方式工作的方式吗?任何启蒙都是受欢迎的。

2 个答案:

答案 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给你推荐的链接。