新手问题 两个小问题,singleton method 和奇怪的符号

colinxt · 2013年07月14日 · 最后由 Guest 回复于 2013年08月23日 · 2532 次阅读

第一个是 singleton method,就是 instance 独有的方法。我不太明白这种方法有什么用,既然一个 instance 是属于一个 class,那么他的方法肯定是 class 里有的。如果这个 instance 比较特别,需要非 class 里面的方法,那么是不是应该考虑继承一下?

第二个问题是符号: 看到这段:

class A
  class << self
    def f(...) ... end
  end
end

不太明白那两个<<是什么意思?

新手问题。。囧。。谢谢指点 ~

实例的单件方法有些场景是有用的 比如你希望某个类在特定情况下某实例方法的表现与其它不同,可以只重定义该实例的方法 至于<<那里 它和 def self.f end 一样

问题 2

这种写法好像叫“打开类”在那个<<块里定义的方法会成为类方法,而不是实例方法。

下面 2 段代码效果一样,让你省写几个self

class A
  class << self
    def a
      puts "a"
    end

    def b
      puts "b"
    end

    def c
      puts "c"
    end
  end
end

class A
    def self.a
      puts "a"
    end

    def self.b
      puts "b"
    end

    def self.c
      puts "c"
    end
end

两个问题是相关联的。class << xxx 中的 selfxxxeigenclass。在 class AselfA,所以 class << self 中定义的方法是定义在 Aeigenclass 中。eigenclass 中定义的方法,只在这个实例中有效,不影响同一个类的对它实例。A 作为 Class 类的实例,定义的方法只对 A 有效,不会到影响到其它的实例方法,简单来说就是定义了 class method。

所以 singleton method 多用在 Class 的对象中来定义 class method。确实比较少应用在其它类型的实例中。一般用在需要对某个对象进行 patch,又不想修改这个类型的其它实例。

@doitian 谢谢,明白理论了,但还是不清楚你说的“在需要对某个对象进行 patch”是个什么情况?

#2 楼 @loveky 谢谢,又 google 了一下看到这个http://blog.csdn.net/spark2008/article/details/7018618,创建一个类方法有五种方式,这里是其中两种。

6 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号