From: KOSAKI Motohiro Date: 2012-01-08T10:30:49+09:00 Subject: [ruby-dev:45111] Re: [ruby-trunk - Feature #5861][Assigned] String#version_compare > バージョン番号っぽい文字列を比較するメソッド、String#version_compare を追加しませんか。 > "2.6.18".version_compare("2.6.3") #=> 1 > などと使います。 > > 詳細な仕様は Gauche の gauche.version モジュールの version-compare 関数の仕様を丸パクリするのが良いと思います。 > 提案している名前も Gauche そのままです。 > http://practical-scheme.net/gauche/man/gauche-refj_103.html > > それなりにユースケースはある…というか今まさにテストを書いていて、 > Linux カーネルのバージョン番号を欲しくなったのですが、いかがでしょうか。 うーん。正直ぴんときません。まずさきほどなるせさんがコミットされた r34232ですが、バージョンの比較処理は1行で書けています > Index: test/socket/test_socket.rb >=================================================================== >--- test/socket/test_socket.rb (revision 34231) >+++ test/socket/test_socket.rb (revision 34232) >@@ -322,6 +322,12 @@ > } > > ip_addrs.each {|ai| >+ if /linux/ =~ RUBY_PLATFORM && ai.ip_address.include?('%') && >+ (`uname -r`[/[0-9.]+/].split('.').map(&:to_i) <=> [2,6,18]) <= 0 >+ # Cent OS 5.6 (2.6.18-238.19.1.el5xen) doesn't correctly work >+ # sendmsg with pktinfo for link-local ipv6 addresses >+ next >+ end それに加えて、(なるせさん自身も指摘されているように)バージョン番号に規則性などないので 意図通り動かないケースが絶対でてきてバグ対応がめんどくさそうです。また、rubyのintreeでは テストケースぐらいしかユーザがいなさそうなので、それだったら正規表現で適当に誤魔化しても 十分という気がします。 また、Linux固有の話の話として、RHEL6の2.6.32ではバグるけど、Ubuntuの2.6.32ではバグらないとか xenカーネルでのみトラブルがおきるといった例外はいくらでも思いつき、結局、主要ユースケースが バグ回避のワークアラウンドのような例外系である限りに置いてなんでもできる正規表現最強はゆるがないんじゃないかという感触でいます。 なにか見落としていたらご指摘よろしくお願いいたします