gpt4 book ai didi

ruby - 为什么是 Module.methods() 和 respond_to?在 irb 中的工作方式与在脚本中不同?

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

我尝试在 Ruby 中使用反射方法,遇到了一种我觉得非常奇怪的行为。

以下示例在 IRB 中和调用 ruby​​ 脚本时似乎有所不同:

示例 1:

def myfun; end
p respond_to?(:myfun)

在 IRb 中,这表示“真”,在脚本中:'false'。

示例 2:

ml = methods
def myfun; end
p methods - ml

在 IRb 中,这表示 [:myfun]。在脚本中:[].

我在 1.8、1.9 MRI、JRuby 1.5.6 等下发现了这个 - 所以我认为这是正常的。

为什么不同?

我很确定“respond_to?”是查看方法是否可用的方法 - 为什么在上述情况下不起作用?

最佳答案

这个函数——“main”对象上的方法——在 ruby​​ 脚本中被定义为私有(private)的。您可以轻松检查:

ml = private_methods
def myfun; end
p private_methods - ml #=> [:myfun]
p respond_to?(:myfun, true) #=> true

如果你明确地调用它,你会得到一个错误:

self.myfun
# NoMethodError: private method ‘myfun’ called for main:Object

另一方面,在 IRB 中,您的方法被定义为公共(public)方法。在引擎盖下它看起来像这样:

class Object
def irb_binding
# this is where your entered code is evaluated
def myfun; :ok; end # you can define methods in other methods
self.myfun # and they are public by default
end
end

p irb_binding # :ok

IRB 可以轻松地在顶层进行评估,但它会使用该方法创建一个单独的环境,以便不共享局部变量:

require "irb"
foo = :ok
IRB.start
#>> foo
# NameError: undefined local variable or method `foo' for main:Object

我认为公开的方法只是实现上的巧合,并不重要。无论如何,这些方法都是暂时的。

关于ruby - 为什么是 Module.methods() 和 respond_to?在 irb 中的工作方式与在脚本中不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15205952/

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