45110 Yui NARUSE <naruse airemix.jp> (2012-01-08 07:54:54 +0900) [ruby-trunk - Feature #5861][Assigned] String#version_compare
45111 KOSAKI Motohiro <kosaki.motohiro gmail.com> (2012-01-08 10:30:49 +0900) 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カーネルでのみトラブルがおきるといった例外はいくらでも思いつき、結局、主要ユースケースが
バグ回避のワークアラウンドのような例外系である限りに置いてなんでもできる正規表現最強はゆるがないんじゃないかという感触でいます。
なにか見落としていたらご指摘よろしくお願いいたします
45112 Nobuyoshi Nakada <nobu ruby-lang.org> (2012-01-08 14:16:23 +0900) [ruby-trunk - Feature #5861] String#version_compare
Issue #5861 has been updated by Nobuyoshi Nakada.
Yui NARUSE wrote:
> バージョン番号っぽい文字列を比較するメソッド、String#version_compare を追加しませんか。
> "2.6.18".version_compare("2.6.3") #=> 1
> などと使います。
Gem::Version.new("2.6.18")<=>Gem::Version.new("2.6.3") でいいんじゃないでしょうか。
----------------------------------------
Feature #5861: String#version_compare
https://bugs.ruby-lang.org/issues/5861
Author: Yui NARUSE
Status: Assigned
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: core
Target version: 2.0.0
バージョン番号っぽい文字列を比較するメソッド、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 カーネルのバージョン番号を欲しくなったのですが、いかがでしょうか。
--
http://redmine.ruby-lang.org