2 月 27 2008
Rails::Initializer.check_ruby_version()
会社の昼休みを使ってコードリーディング。
check_ruby_versionを見ていきます。 メソッド名を見るだけで、何をするメソッドか一目瞭然。
def check_ruby_version
require 'ruby_version_check'
end
require 'ruby_version_check'
end
ruby_version_check.rbをロードして・・
min_release = "1.8.2 (2004-12-25)"
ruby_release = "#{RUBY_VERSION} (#{RUBY_RELEASE_DATE})"
if ruby_release =~ /1\.8\.3/
abort <<-end_message
Rails does not work with Ruby version 1.8.3.
Please upgrade to version 1.8.4 or downgrade to 1.8.2.
end_message
elsif ruby_release <min_release
abort <<-end_message
Rails requires Ruby version #{min_release} or later.
You're running #{ruby_release}; please upgrade to continue.
end_message
end
ruby_release = "#{RUBY_VERSION} (#{RUBY_RELEASE_DATE})"
if ruby_release =~ /1\.8\.3/
abort <<-end_message
Rails does not work with Ruby version 1.8.3.
Please upgrade to version 1.8.4 or downgrade to 1.8.2.
end_message
elsif ruby_release <min_release
abort <<-end_message
Rails requires Ruby version #{min_release} or later.
You're running #{ruby_release}; please upgrade to continue.
end_message
end
短いですね。 Rubyのバージョンが1.8.2を超えているかチェックしているだけのようです。
Process.abortメソッドは、メッセージとともにプログラムを終了するものです。 Rubyのバージョンが1.8.3であるときと、1.8.2未満の場合は終了しています。
どうも1.8.3とRailsは相性が悪いということなんでしょう。
興味深いのは文字列同士の比較演算
"1.8.2" <"1.8.6" # => true
こんな挙動ですよね?Rubyなれしてないと怖くて使えないな・・。
"1.8.2".gsub(/\./,'').to_i <"1.8.6".gsub(/\./,'').to_i
こんな感じで書いちゃうでしょうね。。