问题描述
以下代码在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!
产生此:
at_exit function
in finalizer
我的期望是不应该根据exit!
的文档调用出口处理程序:
https://ruby-doc.org/core-2.7.1/Kernel.html#method-i-exit-21
这是exit!
中的错误吗?
还有其他方法可以实现不触发出口处理程序的预期结果,从而可以保证从内部杀死系统吗?
解决方法
这似乎是JRuby中已知的不兼容性。
Kernel#exit!
和Process::exit!
的规范仅由主要开发人员Benoit Daloze({{1}的维护者)于2020年7月27日(35天前)添加到ruby/spec
Ruby成员TruffleRuby的作者):https://github.com/ruby/spec/commit/3bf0edcecb424df1e3a70fe48971b24af4be1977#diff-5b2f13aa6d64a30812e9221d9994b907R95-R99
2020年7月28日,Benoit将标签添加到JRuby ruby/spec
目录中,以将这些新规范禁用为已知故障:https://github.com/jruby/jruby/commit/f138bd9e62b757e6fd209101b2eb46b266b9b7b0#diff-332fe3279d2469ab891d8739c3d425e3R1-R2
JRuby团队确实运行spec
来确保与所有其他Ruby实现的兼容性,但是当然,如果缺少规范,可能会引起不兼容的情况。