这个函数——“主”对象上的方法——在 ruby 脚本中被定义为私有的。您可以轻松检查:
ml = private_methods
def myfun; end
p private_methods - ml #=> [:myfun]
p respond_to?(:myfun, true) #=> true
如果你在 self 上显式调用它,你会得到一个错误:
self.myfun
# NoMethodError: private method ‘myfun’ called for main:Object
另一方面,在 IRB 中,您的方法被定义为公共的。在引擎盖下,它看起来像这样:
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
我认为公开的方法只是由于实施的巧合,这并不重要。这些方法无论如何都是暂时的。