分享 Ruby 版本常量

chq · 2015年08月25日 · 最后由 douxiance 回复于 2015年09月09日 · 4287 次阅读

说明

在 MRI 1.9 以上的版本中,有一些Object中定义的常量,说明了 Ruby 的版本和平台等信息。

常量 含义
RUBY_DESCRIPTION 和命令行输入ruby -v prints是一样的效果,由表中下列常量组成
RUBY_ENGINE 使用的解释器引擎
RUBY_VERSION 运行的版本号
RUBY_PATCHLEVEL 补丁版本号,1.8 也有这个常量
RUBY_RELEASE_DATE 发布日期,1.8 也有这个常量
RUBY_REVISION SVN 版本号
RUBY_PLATFORM OS 平台,1.8 也有这个常量

使用 RVM 查看 MRI1.8 以上的各个版本对这些常量的兼容性:

rvm all do ruby -e 'puts "#{RUBY_ENGINE} #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]"'

解释下上面的命令:

  • rvm all do ...是依次切换到已经安装 ruby 各个版本的环境下运行相关命令;
  • ruby -e '...' 是使用 ruby 解析器运行一条...的 ruby 语句;
  • puts "..."是在终端的标准输出中打印 Ruby 版本常量。

结果为:

ruby 1.9.1p431 (2011-02-18 revision 30908) [x86_64-linux] ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux] ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux] ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux] ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux] ruby 2.0.0p643 (2015-02-25 revision 49749) [x86_64-linux] ruby 1.9.2p330 (2014-08-07 revision 47094) [x86_64-linux]

因为 rvm 安装的 ruby 和平台不同,结果也可能不一样。

例子

通过这些常量,可以:

1. 不同的平台加载不同的代码或者 GEM 包,兼容各个平台;

如 select IO 的eventmachine

# 省略代码...
elsif RUBY_PLATFORM =~ /java/
  require 'java'
  require 'jeventmachine'
else
  # 省略代码...
    require 'rubyeventmachine'
  # 省略代码...
end

根据不同的平台加载不同的事件驱动引擎,使用 Java JVM 平台会加载 JRUBY 的,否则加载 ruby 的。

2. 不同的版本,打一些猴子补丁或者补丁代码,以兼容各个版本;

如用于心跳检测的god:

# 省略代码...
if RUBY_VERSION < '1.9'
  $KCODE = 'u'
end
# 省略代码...

在 ruby 1.8 的版本中,不是在文件头部加入# coding: utf-8,而是使用全局变量$KCODE 来判断 ruby 文件编码的

3. 检测平台或者版本,只有符合条件才运行程序;

rails

if RUBY_VERSION < '2.2.2' && RUBY_ENGINE == 'ruby'
  # 省略代码...
  abort # 省略代码...
end

正在开发的代码仅仅支持 ruby 2.2.2 以上的版本,如果使用小于这个版本的 ruby 解析器,会打印一串提示信息后,退出程序。

BTW:

对于一些人,然并卵。 一般情况下,了解这些就够用了。 如果高手觉得不够用(这不在本文的范围内),想获取更详细的信息,可以调用下面的 ruby 代码。

puts RbConfig::CONFIG

没有文档,具体用法请查看 ruby ext/extmk.rb源文件。

顶一下吧!

这么好的东西,怎么没有人回复呢? 难道大家都喜欢潜水吗?

#2 楼 @douxiance 内容很好,然而回帖没什么用啊,除了增加水量以外。 优秀的帖子留在论坛里通过搜索引擎就可以找到了,不停顶贴没意义。

@msg7086 说到这个搜索我实在忍不住还想吐槽几句。

先跑个题插一句:当然我还不是云梯的客户,主要是目前可见的一些资料足以满足我的胃,太多了一时我也消化不了。

说到本论坛的搜索功能,我想问一句这里可以说脏话吗? 当然原因大家都懂的,GFW 的杰作嘛。

我每次想找社区里的好东西,只有先去国内的 XX 搜索引擎,通过 site:ruby-china.org 再回来,我忍可以吗?

#4 楼 @douxiance 我只说一句。谷歌搜索是必需品。没有访问谷歌能力的人,没法好好学习和工作。

#4 楼 @douxiance 在墙内时间长了看来你都忘了那玩意叫 GWF

@msg7086 我不是骨粉,但工作上涉及的专业问题,特别是英文资料,确实国内某搜索是弱智的很。这一点,我也很赞成你的观点。 我个人觉得如果社区内搜索可以多个选择就好了,比如现在的浏览器。我在单位和在家里就用的不同的设置。 对于我这样的老油条,其实有或没有,都无法阻止我们前进的脚步,只是从便利性上讲偶尔发发牢骚。

@bastengao 感谢指正,已经修正。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号