我有一个带有工厂方法的脚本,我希望返回某个类的不同实现,具体取决于脚本是从JRuby还是Ruby运行 . 任何人都有任何关于如何从我的脚本中区分出来的想法?
我的一些初步想法是:
如果失败,尝试'包含Java'并抢回Ruby实现 . 此方法不起作用 . 无论我的开始/救援/结束如何,Ruby都足够聪明 .
用进程ID做一些傻瓜 . 我宁愿避免这种情况,因为它总是像黑客一样 .
我相信你可以查看RUBY_PLATFORM常量 .
正如这里已经说过的,有多种方法可以检测JRuby . 这是完整列表,按优先顺序排序:
RUBY_PLATFORM ==“java”
如果定义了?(RUBY_ENGINE)&& RUBY_ENGINE =='jruby'
如果定义? JRUBY_VERSIONJRUBY_VERSION仅在JRuby中定义,并提供短版本信息,如“1.5.0.dev”
我没有意义:当它在JRuby中运行时,它在Ruby中运行,因为JRuby是Ruby的一个实现 .
这就像问“如果我驾驶的是福特汽车而不是汽车?”
如果您想知道正在运行的Ruby实现,那么您可以检查全局 RUBY_ENGINE 常量 . 它应该通用且唯一地识别您正在运行的引擎,尽管它遗憾地失败有三个原因:
RUBY_ENGINE
在一些引擎上,它不会告诉你它正在运行什么引擎,例如在YARV上我希望 RUBY_ENGINE 是 'yarv' ,但它实际上是 'ruby' . 所以,它在"identify"部分失败了 .
'yarv'
'ruby'
甚至更糟:在MRI上,它也是 'ruby' ,这意味着它不仅不会告诉你正在运行什么引擎,而且还有完全不同的引擎返回相同的值 . IOW,它也在"unique"部分失败了 .
,最后但并非最不重要的是, RUBY_ENGINE 是相当新的,所以所有引擎都不支持它,这意味着它在"universal"部分失败了 .
仍然,为了你的目的,像
if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby'
应该工作正常 .
如果您正在调试shell,irb,RVM或某些类型的插件(如Ruby文本编辑器插件),我更喜欢更详细的 RUBY_DESCRIPTION .
RUBY_DESCRIPTION
如果您正在运行JRUBY,则其他常量注释是好的: RUBY_ENGINE , JRUBY_VERSION 或 RUBY_PLATFORM .
JRUBY_VERSION
RUBY_PLATFORM
4 回答
我相信你可以查看RUBY_PLATFORM常量 .
正如这里已经说过的,有多种方法可以检测JRuby . 这是完整列表,按优先顺序排序:
我没有意义:当它在JRuby中运行时,它在Ruby中运行,因为JRuby是Ruby的一个实现 .
这就像问“如果我驾驶的是福特汽车而不是汽车?”
如果您想知道正在运行的Ruby实现,那么您可以检查全局
RUBY_ENGINE
常量 . 它应该通用且唯一地识别您正在运行的引擎,尽管它遗憾地失败有三个原因:在一些引擎上,它不会告诉你它正在运行什么引擎,例如在YARV上我希望
RUBY_ENGINE
是'yarv'
,但它实际上是'ruby'
. 所以,它在"identify"部分失败了 .甚至更糟:在MRI上,它也是
'ruby'
,这意味着它不仅不会告诉你正在运行什么引擎,而且还有完全不同的引擎返回相同的值 . IOW,它也在"unique"部分失败了 .,最后但并非最不重要的是,
RUBY_ENGINE
是相当新的,所以所有引擎都不支持它,这意味着它在"universal"部分失败了 .仍然,为了你的目的,像
应该工作正常 .
如果您正在调试shell,irb,RVM或某些类型的插件(如Ruby文本编辑器插件),我更喜欢更详细的
RUBY_DESCRIPTION
.如果您正在运行JRUBY,则其他常量注释是好的:
RUBY_ENGINE
,JRUBY_VERSION
或RUBY_PLATFORM
.