在 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 语句;结果为:
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 和平台不同,结果也可能不一样。
通过这些常量,可以:
如 select IO 的eventmachine:
# 省略代码...
elsif RUBY_PLATFORM =~ /java/
require 'java'
require 'jeventmachine'
else
# 省略代码...
require 'rubyeventmachine'
# 省略代码...
end
根据不同的平台加载不同的事件驱动引擎,使用 Java JVM 平台会加载 JRUBY 的,否则加载 ruby 的。
如用于心跳检测的god:
# 省略代码...
if RUBY_VERSION < '1.9'
$KCODE = 'u'
end
# 省略代码...
在 ruby 1.8 的版本中,不是在文件头部加入# coding: utf-8
,而是使用全局变量$KCODE 来判断 ruby 文件编码的
如 rails:
if RUBY_VERSION < '2.2.2' && RUBY_ENGINE == 'ruby'
# 省略代码...
abort # 省略代码...
end
正在开发的代码仅仅支持 ruby 2.2.2 以上的版本,如果使用小于这个版本的 ruby 解析器,会打印一串提示信息后,退出程序。
对于一些人,然并卵。 一般情况下,了解这些就够用了。 如果高手觉得不够用(这不在本文的范围内),想获取更详细的信息,可以调用下面的 ruby 代码。
puts RbConfig::CONFIG
没有文档,具体用法请查看 ruby ext/extmk.rb源文件。