类<< self在Ruby中做什么?
当前回答
А singleton方法是仅为单个对象定义的方法。
例子:
class SomeClass
class << self
def test
end
end
end
test_obj = SomeClass.new
def test_obj.test_2
end
class << test_obj
def test_3
end
end
puts "Singleton's methods of SomeClass"
puts SomeClass.singleton_methods
puts '------------------------------------------'
puts "Singleton's methods of test_obj"
puts test_obj.singleton_methods
SomeClass的单例方法
test
test_obj的单例方法
test_2
test_3
其他回答
А singleton方法是仅为单个对象定义的方法。
例子:
class SomeClass
class << self
def test
end
end
end
test_obj = SomeClass.new
def test_obj.test_2
end
class << test_obj
def test_3
end
end
puts "Singleton's methods of SomeClass"
puts SomeClass.singleton_methods
puts '------------------------------------------'
puts "Singleton's methods of test_obj"
puts test_obj.singleton_methods
SomeClass的单例方法
test
test_obj的单例方法
test_2
test_3
首先,class << foo语法打开了foo的单例类(eigenclass)。这允许您对特定对象上调用的方法的行为进行专门化。
a = 'foo'
class << a
def inspect
'"bar"'
end
end
a.inspect # => "bar"
a = 'foo' # new object, new singleton class
a.inspect # => "foo"
现在,回答这个问题:class << self打开了self的单例类,这样就可以为当前self对象(在类或模块体中是类或模块本身)重新定义方法。通常,这用于定义类/模块(“静态”)方法:
class String
class << self
def value_of obj
obj.to_s
end
end
end
String.value_of 42 # => "42"
这也可以写成一种速记:
class String
def self.value_of obj
obj.to_s
end
end
或者更短:
def String.value_of obj
obj.to_s
end
在函数定义中,self指向调用函数的对象。在这种情况下,类<< self打开该对象的单例类;其中一个用途是实现一个穷人的状态机:
class StateMachineExample
def process obj
process_hook obj
end
private
def process_state_1 obj
# ...
class << self
alias process_hook process_state_2
end
end
def process_state_2 obj
# ...
class << self
alias process_hook process_state_1
end
end
# Set up initial state
alias process_hook process_state_1
end
因此,在上面的示例中,StateMachineExample的每个实例都有别名为process_state_1的process_hook,但注意在后者中,它可以将process_hook(仅用于自身,不影响其他StateMachineExample实例)重新定义为process_state_2。因此,每次调用者调用process方法(该方法调用可重定义的process_hook)时,行为都会根据它所处的状态而改变。
什么类<< thing做:
class Hi
self #=> Hi
class << self #same as 'class << Hi'
self #=> #<Class:Hi>
self == Hi.singleton_class #=> true
end
end
[它使自己==东西。]Singleton_class在它的块的上下文中]。
什么是thing.singleton_class?
hi = String.new
def hi.a
end
hi.class.instance_methods.include? :a #=> false
hi.singleton_class.instance_methods.include? :a #=> true
Hi对象从它的#singleton_class继承它的#方法。然后从它的#class.instance_methods。 这里我们给出了hi的单例类实例方法:a。它可以用类<< hi来代替。 Hi 's #singleton_class拥有Hi 's #class拥有的所有实例方法,可能还有更多(:a here)。
[事物的#class和#singleton_class的实例方法可以直接应用于事物。]露比看到的时候。首先,它在thing.singleton_class中查找方法定义。Instance_methods然后在thing。class。Instance_methods中
顺便说一下,他们调用对象的singleton class == metaclass == eigenclass。
我发现了一个超级简单的解释类<< self,本征类和不同类型的方法。
在Ruby中,有三种类型的方法可以应用到一个类:
实例方法 单例方法 类方法
实例方法和类方法几乎与其他编程语言中的同名方法相似。
class Foo
def an_instance_method
puts "I am an instance method"
end
def self.a_class_method
puts "I am a class method"
end
end
foo = Foo.new
def foo.a_singleton_method
puts "I am a singletone method"
end
另一种访问本征类(包括单例方法)的方法是使用以下语法(class <<):
foo = Foo.new
class << foo
def a_singleton_method
puts "I am a singleton method"
end
end
现在你可以为self定义一个单例方法,它是类Foo本身在这个上下文中:
class Foo
class << self
def a_singleton_and_class_method
puts "I am a singleton method for self and a class method for Foo"
end
end
end
事实上,如果您为Ruby项目编写任何C扩展,实际上只有一种方法可以定义Module方法。
rb_define_singleton_method
我知道这个自我业务只是打开了各种各样的问题,所以你可以通过搜索每个部分来做得更好。
第一个对象。
foo = Object.new
我可以为foo创建一个方法吗?
Sure
def foo.hello
'hello'
end
我该拿它怎么办?
foo.hello
==>"hello"
只是另一个物体。
foo.methods
你得到所有的Object方法加上你的新方法。
def foo.self
self
end
foo.self
只有foo对象。
试着看看从其他对象(如Class和Module)中创建foo会发生什么。所有答案中的例子都很好玩,但你必须使用不同的想法或概念才能真正理解代码的编写方式。现在你有很多项要看。
Singleton, Class, Module, self, Object, and Eigenclass was brought up but Ruby doesn't name Object Models that way. It's more like Metaclass. Richard or __why shows you the idea here. http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html And if the blows you away then try looking up Ruby Object Model in search. Two videos that I know of on YouTube are Dave Thomas and Peter Cooper. They try to explain that concept too. It took Dave a long time to get it so don't worry. I'm still working on it too. Why else would I be here? Thanks for your question. Also take a look at the standard library. It has a Singleton Module just as an FYI.
这很不错。 https://www.youtube.com/watch?v=i4uiyWA8eFk
推荐文章
- Ruby中没有增量操作符(++)?
- 如何得到一个特定的输出迭代哈希在Ruby?
- Ruby正则表达式中\A \z和^ $的区别
- __FILE__在Ruby中是什么意思?
- Paperclip::Errors::MissingRequiredValidatorError with Rails
- Ruby:如何将散列转换为HTTP参数?
- 在ROR迁移期间,将列类型从Date更改为DateTime
- 把一个元素推到数组开头最简单的方法是什么?
- ActiveRecord:大小vs计数
- Ruby的dup和克隆方法有什么区别?
- 我怎么才能跳出露比·普利的怪圈?
- Rails:在大数字中添加逗号有Rails技巧吗?
- 如何升级红宝石
- 如何找到包含匹配值的哈希键
- 如何在Rails中找到当前的路由?