Ruby类问题

Ruby class question

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
class << self idiom in Ruby

我有一个快速的Ruby问题。 我来自Java / c背景,所以我在Ruby"self"中理解当在实例方法中引用时就像"this"一样。 而"自我"。 方法的前缀将其定义为类方法。

但这是什么意思?

1
2
3
4
class << self
  def some_method
  end
end

这里发生的是我们从内部重新打开一个对象的类,并在其上定义一个新的实例方法。这是你可以在Ruby中进行所谓的"猴子修补"的方法之一。此方法仅将方法添加到当前对象而不是类的所有对象。

这相当于这样做:

1
2
3
4
5
6
7
8
9
10
11
my_obj = MyClass.new

class << my_obj
  def some_method
  end
end

# or...

def my_obj.some_method
end

这是一篇很好的文章,涵盖了它:学习Ruby:class << self。


语法class << some_objct打开some_object的单例类,这是一个特殊的"秘密"类,只有该对象所属。使用单例类,您可以定义一个对象响应的方法,而其正常类的其他实例则不会。

所以,例如:

1
2
3
4
5
6
7
8
9
10
11
a ="Hello world"
b ="Hello world" # Note that this is a different String object

class << a
  def first_letter
    self[0,1]
  end
end

puts a.first_letter # prints"H"
puts b.first_letter # Raises an error because b doesn't have that method

在类上下文中,这两个方法定义是等效的:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Foo
  def self.bar
    puts"Yo dawg"
  end
end

class Foo
  class << self
    def bar
      puts"Yo dawg"
    end
  end
end

第二种形式在某些情况下很有用(例如,当你想为类对象本身声明attr_accessor时)。


这是为对象的singleton / eigen类定义方法的方法。

1
2
3
4
class << foo
  def bar
  end
end

相当于

1
2
def foo.bar
end

如果你这样使用它:

1
2
3
4
5
6
7
8
9
10
11
12
class Foo
    class << self
        def something
            puts"something"
        end
        def something_else
            puts"something else"
        end
    end
end

Foo.something

这是一个简写:

1
2
3
4
5
6
7
8
class Foo
    def self.something
        puts"something"
    end
    def self.something_else
        puts"something else"
    end
end

我不是那种符号的粉丝,真的。