From: "NARUSE, Yui" Date: 2012-01-09T00:29:10+09:00 Subject: [ruby-dev:45114] Re: [ruby-trunk - Feature #5861][Assigned] String#version_compare (2012/01/08 10:30), KOSAKI Motohiro wrote: > うーん。正直ぴんときません。まずさきほどなるせさんがコミットされた > r34232ですが、バージョンの比較処理は1行で書けています > >> + (`uname -r`[/[0-9.]+/].split('.').map(&:to_i) <=> [2,6,18]) <= 0 この方法がイマイチなのは以下の 2 点ですね。 * split でたくさん String ができる * バージョン比較という意図がわかりづらい > それに加えて、(なるせさん自身も指摘されているように)バージョン番号に規則性などないので > 意図通り動かないケースが絶対でてきてバグ対応がめんどくさそうです。また、rubyのintreeでは > テストケースぐらいしかユーザがいなさそうなので、それだったら正規表現で適当に誤魔化しても > 十分という気がします。 指摘しているのはわたしではなく、gauche の仕様を決めた人かマニュアルを書いた人ですね、 たぶん shiro さん? gauche 側にとっては仕様かどうかの決定は難しい問題ですが、わたしの提案では 「gauche 仕様の丸パクリ」としているので、バグかどうかの判断は明快です。 正規表現だと "2.6.13" <=> "2.6.4" の時に面倒になります。 (ようするに Ruby と違って可変長の場合) また、OpenSSL のようにアルファベットを使う流儀も悩ましい。 > また、Linux固有の話の話として、RHEL6の2.6.32ではバグるけど、Ubuntuの2.6.32ではバグらないとか > xenカーネルでのみトラブルがおきるといった例外はいくらでも思いつき、結局、主要ユースケースが > バグ回避のワークアラウンドのような例外系である限りに置いてなんでもできる正規表現最強はゆるがないんじゃないかという感触でいます。 正規表現だと桁またいだ瞬間一気に複雑化しますからねぇ。 -- NARUSE, Yui