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。
语法
所以,例如:
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 |
第二种形式在某些情况下很有用(例如,当你想为类对象本身声明
这是为对象的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 |
我不是那种符号的粉丝,真的。