= [Ruby] 自身を実行している処理系の種類を判定する
:tags: ruby
:description: Ruby には複数の実装があるが、自身を実行している処理系の種類を \
              スクリプト上からどのように判定すればよいだろうか。
:revision-1: 2021-10-02 Qiita から移植

この記事は Qiita から移植してきたものです。 元 URL:
https://qiita.com/nsfisis/items/74d7ffeeebc51b20d791

'''''

Ruby
という言語には複数の実装があるが、それらをスクリプト上からどのようにして
programmatically に見分ければよいだろうか。

`Object` クラスに定義されている `RUBY_ENGINE`
という定数がこの用途に使える。

参考:
https://docs.ruby-lang.org/ja/latest/method/Object/c/RUBY_ENGINE.html[Object::RUBY_ENGINE]

上記ページの例から引用する:

[source,shell-session]
----
$ ruby-1.9.1 -ve 'p RUBY_ENGINE'
ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux]
"ruby"
$ jruby -ve 'p RUBY_ENGINE'
jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java]
"jruby"
----

それぞれの処理系がどのような値を返すかだが、stack overflow
に良い質問と回答があった。

https://stackoverflow.com/a/9894232[What values for RUBY_ENGINE
correspond to which Ruby implementations?] より引用:

____
[cols="^,<",options="header",]
|===
|RUBY_ENGINE |Implementation
|<undefined> |MRI < 1.9
|`ruby' |MRI >= 1.9 or REE
|`jruby' |JRuby
|`macruby' |MacRuby
|`rbx' |Rubinius
|`maglev' |MagLev
|`ironruby' |IronRuby
|`cardinal' |Cardinal
|===
____

なお、この質問・回答は
2014年になされたものであり、値は変わっている可能性がある。MRI (aka
CRuby) については執筆時現在 (2020/12/8) も `'ruby'`
が返ってくることを確認済み。

この表にない主要な処理系として、https://mruby.org[mruby] は `'mruby'`
を返す。

https://github.com/mruby/mruby/blob/ed29d74bfd95362eaeb946fcf7e865d80346b62b/include/mruby/version.h#L32-L35[mruby
該当部分のソース] より引用:

[source,c]
----
/*
 * Ruby engine.
 */
#define MRUBY_RUBY_ENGINE  "mruby"
----
