ごとけんです

In message "[ruby-list:7778] Re: mail index sort by From:"
    on 98/04/28, Shin-ichiro Hara <sinara / blade.nagaokaut.ac.jp> writes:
>原です。

>nonzero? はごく最近入ったのですね。仕様は「? 系」の関数に
>あるまじきもので、
>
>> それとも nonzero? って false か数値を返すものなんでしょうか? 
>
>まさにその通りなんです。この場合のためにあるようなものかな。

皆さんのお答えに従い、 nonzero? 使うために 1.1b_16 に
したんですが、よくよく考えると僕が作りたいのは
 MH の sort(1) みたいに可変個のオプションを受けて
それに従いソートするものでした。
この場合 or による打ちきりが使えないのであんまり
嬉しくないです。
# できるのかなぁ。

とりあえずこういうものを書きました。よろしければ
野次下さい。
parsedate した結果から作った Time オブジェクトを
header['time'] として各 Mail オブジェクトに
持たせて、'Date' に依るソートにはこれを使います。
あと逆順ソートも指定するのにはヘッダのフィールド名に
":r" を付加します。

mbox = MailFolder.new(フォルダのパス)
mbox.sort("Date:r", "Subject")

のように使うものです。

class MailFolder
# 前略

  def sort(*args)
    n = args.size
    # デフォルトでは 'Date'
    args << 'Date' if n == 0 or not args.include?('Date')
    opts = Array.new(n)

    cnt = 0
    args = args.collect {|i|
      # フィールドごとのオプションを拾う
      if i =~ /^(\w+):(\w+)$/
	i = $1
	opts[cnt] = $2
	cnt += 1
      end
      if i == 'Date'; 'time'; else; i; end
    }

    MailFolder @inbox.sort{|x,y|
      r = 1
      args.each_with_index{|i,cnt|
        # どちらかにそのフィールドがなければ次
	next unless x[i] and y[i]

	case opts[cnt]
	when "r"
          # 降順
	  r = (y[i] <=> x[i])
	else
          # デフォルトは昇順
	  r = (x[i] <=> y[i])
	end
	break if r.nonzero?
      }
      r 
    }
  end

# 後略
end

-- gotoken

PS. 
>> あと、前のメールで3進で重みを着けなくても良いんじゃないかと
>> 指摘されましたが、ただ単に和を取るとダメだと思います。
>
>あれ、ちゃんと ( )<<2 + ( )<<1 + ( ) と重みを付けましたよ。^^;

あ、失礼しました m(_ _)m
# 頭も目も悪いぞ > 俺