在ruby中,self.method和类中的方法之间有什么区别<<自

时间:2011-04-01 01:40:36

标签: ruby

class Foo

  def self.one; 1 end

  class << self
    def two; 2 end
  end

end
puts Foo.singleton_methods.inspect # => ["two", "one"]

我被告知上述方法“一”和“二”在概念上有所不同,但我不知道如何。 它们都是单身方法 - 概念和应用的区别是什么?

2 个答案:

答案 0 :(得分:7)

在申请中,没有区别。在概念上,差异是微妙的,但在第一种情况下,您在当前上下文中操作,并在另一个类实例上定义一个方法(实际上,在其Eigenclass中定义实例方法),而在第二种情况下,您正在进入其他类实例的元类(“Eigenclass”)的上下文,然后定义实例方法。

编辑:

我应该补充一点,在某些情况下选择class << self的原因是......

  1. 定义多个类方法时更清晰的语法。
  2. 除了def my_method ...之外,您还可以在Eigenclass上下文中执行其他类型的代码。例如,您可以在该代码块中说attr_accessor :some_attribute

答案 1 :(得分:4)

我强烈建议您阅读“Metaprogramming Ruby”。 本书解释了Ruby的对象模型,包括单例方法和单例类。

http://pragprog.com/titles/ppmetr/metaprogramming-ruby

本文也解释了相同的主题。

http://www.contextualdevelopment.com/articles/2008/ruby-singleton