我有一个带有工厂方法的脚本,我希望返回某个类的不同实现,具体取决于脚本是从JRuby还是Ruby运行。任何人都有任何关于如何从我的脚本中区分出来的想法?
我的一些初步想法是:
如果失败,尝试'包含Java'并抢回Ruby实现。此方法不起作用。无论我的开始/救援/结束如何,Ruby都足够聪明。
使用进程ID做一些傻瓜。我宁愿避免这种情况,因为它总是像黑客一样。
答案 0 :(得分:49)
我相信你可以查看RUBY_PLATFORM常量。
答案 1 :(得分:44)
正如这里已经说过的,有多种方法可以检测JRuby。这是完整列表,按优先顺序排序:
简单明了:
RUBY_PLATFORM == "java"
这也可以用于其他动作。缺点是MRI 1.8.6和1.8.7还不支持RUBY_ENGINE,所以我们需要定义?检查:
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
如果您想了解的不仅仅是JRuby还是:
if defined? JRUBY_VERSION
JRUBY_VERSION仅在JRuby中定义,并提供短版本信息,如“1.5.0.dev”
最不喜欢的方式:要求'java'或要求'jruby'并进行救援。不应该使用。
答案 2 :(得分:7)
我不太明白你的问题。您似乎混合了两个完全不同的抽象级别:Ruby是一种编程语言,JRuby是Ruby编程语言的编译器。您的程序是在Ruby中运行还是在JRuby中运行的问题没有意义:当它在JRuby中运行时, 在Ruby中运行,因为JRuby是Ruby的实现。
这与询问“我怎么能判断我是驾驶福特还是驾驶汽车?”一样。
如果您想知道正在运行的Ruby实现,那么您可以检查全局RUBY_ENGINE
常量。它应该通用且唯一地识别您正在运行的引擎,尽管遗憾的是它有三个原因:
RUBY_ENGINE
是'yarv'
,但它是实际上是'ruby'
。因此,它在“识别”部分失败了。'ruby'
,这意味着它不仅不会告诉你正在运行什么引擎,而且还完全不同返回相同值的引擎。 IOW,它也在“独特”部分失败。RUBY_ENGINE
相当新,所以所有引擎都不支持它,这意味着它在“通用”部分失败。仍为您的目的
if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby'
应该可以正常工作。
答案 3 :(得分:2)
如果您正在调试shell,irb,RVM或某些类型的插件(如Ruby文本编辑器插件),我更喜欢更详细的RUBY_DESCRIPTION
。
如果您尝试运行某些代码,如果您是否正在运行JRUBY,则评论的其他常量很好:RUBY_ENGINE
,JRUBY_VERSION
或RUBY_PLATFORM