与文档相反,Ruby的“ exit!”函数似乎调用出口处理程序

问题描述

以下代码在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实现的兼容性,但是当然,如​​果缺少规范,可能会引起不兼容的情况。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...