我有一个带有工厂方法的脚本,我希望返回某个类的不同实现,具体取决于脚本是从JRuby还是Ruby运行.任何人都有任何关于如何从我的脚本中区分出来的想法?
我的一些初步想法是:
如果失败,尝试"包含Java"并回退到Ruby实现.此方法不起作用.无论我的开始/救援/结束如何,Ruby都足够聪明.
用进程ID做一些傻瓜.我宁愿避免这种情况,因为它总是像黑客一样.
Vla*_*kov 44
正如这里已经说过的,有多种方法可以检测JRuby.这是完整列表,按优先顺序排序:
简单明了:
Run Code Online (Sandbox Code Playgroud)RUBY_PLATFORM == "java"
这也可以用于其他动作.缺点是MRI 1.8.6和1.8.7还不支持RUBY_ENGINE,所以我们需要定义?校验:
Run Code Online (Sandbox Code Playgroud)if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
如果你想知道的不仅仅是它是否是JRuby:
Run Code Online (Sandbox Code Playgroud)if defined? JRUBY_VERSIONJRUBY_VERSION仅在JRuby中定义,并提供短版本信息,如"1.5.0.dev"
最不喜欢的方式:要求'java'或要求'jruby'和救援.不应该使用.
我不太明白你的问题.您似乎混合了两个完全不同的抽象级别:Ruby是一种编程语言,JRuby是Ruby编程语言的编译器.这个问题在Ruby或JRuby中程序是否正在运行只是普通的没有任何意义:当它在JRuby的运行,它是用Ruby运行,因为JRuby是红宝石的实现.
这就像问"如果我驾驶的是福特汽车而不是汽车?"
如果您想知道正在运行的Ruby实现,那么您可以检查全局RUBY_ENGINE常量.它应该通用且唯一地识别您正在运行的引擎,尽管它遗憾地失败有三个原因:
RUBY_ENGINE上'yarv',但它实际上是'ruby'.因此,它在"识别"部分失败了.'ruby',这意味着它不仅不会告诉你正在运行什么引擎,而且还有完全不同的引擎返回相同的值.Iow,它也在"独特"部分失败了.RUBY_ENGINE是,它是相当新的,所以它还没有得到所有引擎的支持,这意味着它在"通用"部分失败了.仍然,为了你的目的,像
if defined? RUBY_ENGINE && RUBY_ENGINE == 'jruby'
Run Code Online (Sandbox Code Playgroud)
应该工作正常.