gpt4 book ai didi

Ruby:了解 _why 的 cloaker 方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:00:51 24 4
gpt4 key购买 nike

我正在尝试了解 _why 的 cloaker他在“A Block Costume”中写到的方法:

class HTML
def cloaker &blk
(class << self; self; end).class_eval do
# ... rest of method
end
end
end

我意识到 class << self; self; end打开 self 的特征类,但我以前从未见过有人在实例方法中这样做。什么是 self在我们这样做的时候?我的印象是self应该是调用该方法的接收者,但是 cloaker从内部调用 method_missing :

def method_missing tag, text = nil, &blk
# ...
if blk
cloaker(&blk).bind(self).call
end
# ...
end

那么 self 是什么?在method_missing里面称呼?什么是self当我们打电话时:

((class << self; self; end).class_eval)

cloaker里面方法?

基本上,我想知道我们是要打开 HTML 类的 Eignenclass,还是要对 HTML 类的特定实例执行此操作?

最佳答案

cloaker 方法中,self 将是 HTML 的一个实例,因为您将在一个对象上调用它,所以您实际上是在 HTML 上创建一个单例方法类实例。例如:

class HTML
def cloaker &blk
(class << self; self; end).class_eval do
def new_method
end
end
end
end

obj = HTML.new
obj.cloaker
p HTML.methods.grep /new_method/ # []
p obj.singleton_methods # [:new_method]

编辑

或者正如 Jörg W Mittag 评论的那样,这只是调用 "Object#define_singleton_method"

的 pre-1.9 方式

关于Ruby:了解 _why 的 cloaker 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16441683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com