gpt4 book ai didi

ruby - `instance_eval` 和范围

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:40 25 4
gpt4 key购买 nike

我有以下代码:

class A
def self.scope
yield
end
def self.method_added method
self.instance_eval %{
# do something involving the added method
}
end
end

class B < A
scope do
def foo
end
end
end

当触发method_added 钩子(Hook)时,instance_eval 中的代码是否会在与添加的方法相同的范围内运行?或者,它会跑到外面吗?

其中涉及哪些注意事项和陷阱?

最佳答案

您的 scope 方法基本上是空操作。当您将一个 block 传递给产生的方法时,该 block 将在当前 范围内进行评估。观察:

class A
def self.scope
yield
end
end

A.scope { p self }
# main

因为 block 没有产生任何东西,yield 的返回值也没有做任何事情, block 中运行的任何代码在范围 阻止。

但是,instance_eval 不是这种情况。当 instance_eval 运行一个 block 时, block 中的 self 被设置为接收者(而不是 block 范围内的任何 self )。像这样:

class A
end

A.instance_eval { p self }
# A

但请注意,这意味着 self.instance_eval { ... } 也是一个花哨的空操作,因为您正在将 block 的 self 更改为相同的self block 外。

所以你的代码等同于:

class A
def self.method_added method
# do something involving the added method
end
end

class B < A
def foo
end
end

关于ruby - `instance_eval` 和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28221626/

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