以下代码在 Windows 上的 JRuby 9.1.17.0 和 9.2.13.0 上运行:
at_exit { puts "at_exit function" }
ObjectSpace.define_finalizer("string", proc { puts "in finalizer" })
exit!
Run Code Online (Sandbox Code Playgroud)
产生这个:
at_exit function
in finalizer
Run Code Online (Sandbox Code Playgroud)
我的期望是不应该根据以下文档调用退出处理程序exit!:https :
//ruby-doc.org/core-2.7.1/Kernel.html#method-i-exit-21
这是一个错误exit!吗?
有没有其他方法可以实现不触发退出处理程序的预期结果,以便我可以保证从内部杀死我的系统?
这看起来像是 JRuby 中已知的不兼容性。
为规范Kernel#exit!和Process::exit!只添加到ruby/spec七月,27日2020(35天前)由伯努瓦Daloze(的维护者ruby/spec,TruffleRuby的主要开发者,JRuby团队成员):https://github.com/ruby/spec/commit/3bf0edcecb424df1e3a70fe48971b24af4be1977 #diff-5b2f13aa6d64a30812e9221d9994b907R95-R99
2020 年 7 月 28 日,Benoit 在 JRubyspec目录中添加了标签,将这些新规范禁用为已知故障:https : //github.com/jruby/jruby/commit/f138bd9e62b757e6fd209101b2eb46b266b9b7b0#diff-392323R3R-37323R
JRuby 团队确实运行ruby/specs 以确保与所有其他 Ruby 实现的兼容性,但当然,如果缺少规范,不兼容性可能会被忽视。