我有一个工厂方法的脚本,我希望根据脚本是否从JRuby或Ruby运行来返回某个类的不同实现。 有没有任何想法可以告诉我如何在我的脚本内部区分它们?
我最初的想法是:
尝试“包含Java”,并在失败时回退到Ruby实现。这种方法不起作用。 Ruby聪明到足以在begin / rescue / end之外引发错误。
使用进程ID处理一些滑稽的事情。 我宁愿避免这种方法,因为它总感觉像是一个hack。
我相信你可以检查RUBY_PLATFORM常量。
如已在此处说明,有多种方法可以检测JRuby。以下是按首选项排序的完整列表:
简单而直接:
这也可以用于其他实现。不足之处在于MRI 1.8.6和1.8.7尚不支持RUBY_ENGINE,因此我们需要使用defined?检查:RUBY_PLATFORM == "java"
如果你想了解更多信息而不仅仅是是否为JRuby:
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
if defined? JRUBY_VERSION
JRUBY_VERSION仅在JRuby中定义,并提供短版本信息,如“1.5.0.dev”。
最不喜欢的方法:使用require 'java'或require 'jruby'并进行异常捕获。不应使用。
if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby'
应该可以正常工作。
JRUBY_VERSION
来隔离与平台相关的代码。 - user1934428