- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我自己扩展了Kernel
,在实例方法Kernel#abort
的定义中,我调用了单例方法Kernel.abort
:
module Kernel
extend self
def abort
puts "Press ENTER to exit..."
gets
Kernel.abort
end
end
abort
当我调用 Kernel#abort
时,方法定义中的 Kernel.abort
调用似乎是指原始的 Kernel#abort
(扩展为 Kernel.abort
)。
Ruby 如何知道当我写 Kernel.abort
时,我指的是原始的 abort
方法,而不是我刚刚创建的方法?我将如何递归调用我刚刚创建的新 abort
方法?
最佳答案
Kernel.abort
的定义是首先定义一个实例方法 Kernel#abort
,然后用 module_function
使它也成为一个单例方法。 (This is definitely the case in Rubinius;我在 MRI 源中找不到它,但请参见下文。)module_function
makes a copy of the method.当您重新定义 abort
时,您重新定义了实例方法而不是单例副本。
Object
包含 Kernel
,所以当您说 abort
时,您会得到您重新定义的实例方法,但是当您说 Kernel.abort
你得到了你没有重新定义的单例方法。
如果您真的想在 abort
中使用递归,或者只是为了证明这个解释是正确的,请在重新定义方法后调用 module_function :abort
。单例方法将更新为与实例方法相同,并且两种方法都将递归。
请注意,您不需要extend self
来重新定义abort
的实例版本。由于Kernel
已经包含在Object
中,所以你只需要重新定义所有对象的实例方法就可以看到重新定义的版本。另一方面,如果 Kernel
首先使用 extend self
来公开 #abort
,我们可以重新定义它而不会出现任何复杂情况。
以下演示了用户定义的纯 Ruby 方法缺少递归,即 module_function
负责而 native 方法不是:
$ cat foo.rb
module Foo
def bar
puts "old version"
end
module_function :bar
end
module Foo
def bar
puts "new version"
Foo.bar
end
end
Object.include Foo
bar
$ ruby foo.rb
new version
old version
关于ruby - 在扩展自身的模块中的实例方法中调用单例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35339860/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!