[#37492] ReFe 0.6 — Minero Aoki <aamine@...>

あおきです。

27 messages 2003/04/01
[#37525] ReFe 0.7 (Re: ReFe 0.6) — Minero Aoki <aamine@...> 2003/04/06

あおきです。

[#37528] Re: ReFe 0.7 (Re: ReFe 0.6) — Koji Arai <JCA02266@...> 2003/04/07

新井です。

[#37545] Re: ReFe 0.7 (Re: ReFe 0.6) — Kazuhiro NISHIYAMA <zn@...> 2003/04/10

西山和広です。

[#37546] Re: ReFe 0.7 (Re: ReFe 0.6) — Koji Arai <JCA02266@...> 2003/04/10

新井です。

[#37551] Re: ReFe 0.7 (Re: ReFe 0.6) — Kazuhiro NISHIYAMA <zn@...> 2003/04/11

西山和広です。

[#37554] refe.el (Re: ReFe 0.7 (Re: ReFe 0.6)) — Koji Arai <JCA02266@...> 2003/04/12

新井です。

[#37619] net/pop.rbにUIDLコマンドでMessage-Idのリストを取得するメソッド — Keisuke Minami <keisuke@...>

こんにちは。三並です。

18 messages 2003/04/26

[#37622] net/imapのTHREAD Extension 対応 — wanowa.kimura@... (kimura wataru)

 木村といいます。

31 messages 2003/04/27
[#37628] Re: net/imapのTHREAD Extension 対応 — Shugo Maeda <shugo@...> 2003/04/28

前田です。

[#37632] Re: net/imap のTHREAD Extension 対応 — wanowa.kimura@... (kimura wataru) 2003/04/28

 木村といいます。

[#37635] Re: net/imap のTHREAD Extension 対応 — Shugo Maeda <shugo@...> 2003/04/30

前田です。

[#37638] Re: net/imap のTHREAD Extension 対応 — wanowa.kimura@... (kimura wataru) 2003/05/01

 木村です。

[#37641] Re: net/imap のTHREAD Extension 対応 — Shugo Maeda <shugo@...> 2003/05/02

前田です。

[#37647] Re: net/imap のTHREAD Extension 対応 — wanowa.kimura@... (kimura wataru) 2003/05/06

 木村です。

[#37648] マッチした部分を配列にしまう方法 — Hirano Satoshi <hirano@...> 2003/05/07

こんにちは。

[ruby-list:37628] Re: net/imapのTHREAD Extension 対応

From: Shugo Maeda <shugo@...>
Date: 2003-04-28 06:49:43 UTC
List: ruby-list #37628
前田です。

At Sun, 27 Apr 2003 14:33:57 +0900,
wanowa.kimura@nifty.ne.jp (kimura wataru) wrote:
>  net/imapをTHREADコマンドに対応させるために、以下のメソッドを
> 追加してみました。
> 
> Net::IMAP#thread(argorithm, search_keys, charset)
> Net::IMAP#uid_thread(argorithm, search_keys, charset)
> 
> argorithmには"REFERENCES"または"ORDEREDSUBJECT"が指定できます。

おお、すばらしい。

>  返値の構造などいまいち確信が持てないので、みなさんのコメントが
> いただければと思います。

一点だけ気になったところがあるのですが、

      def thread_branch(token)
	rootmember = nil
	lastmember = nil

	add_member = proc {|seqno|
	  newmember = ThreadMember.new(seqno, [])
	  if rootmember.nil?
	    rootmember = newmember
	  else
	    lastmember.children << newmember
	  end
	  newmember
	}

	while true
	  shift_token    # ignore first T_LPAR
	  token = lookahead

	  case token.symbol
	  when T_NUMBER
	    lastmember = add_member.call(number)
	  when T_SPACE
	    # do nothing
	  when T_LPAR
	    if rootmember.nil?
	      # dummy member
	      lastmember = add_member.call(nil)
	    end

	    lastmember.children << thread_branch(token)
	  when T_RPAR
	    break
	  end
	end

	return rootmember
      end

上記のようにthread_branchの中で毎回Procオブジェクトを生成していま
すが、ThreadTreeのようなクラス(名前が適切かわかりませんが)を用意
して、このクラスのメソッドにコードを移動してはどうでしょうか?

たとえば、以下のようなイメージです。
# テストしていませんので、このままでは動かないかも。

  class ThreadTree
    attr_reader :root, last

    def initialize
      @root = nil
      @last = nil
    end

    def add_member(seqno)
      newmember = ThreadMember.new(seqno, [])
      if @root.nil?
        @root = newmember
      else
        @last.children.push(newmember)
      end
      @last = newmember
    end    

    def add_subthread(member)
      if @root.nil?
	# dummy member
        add_member(nil)
      end
      @last.children.push(member)
    end
  end

  ....

  def thread_branch(token)
    thread_tree = ThreadTree.new

    while true
      shift_token    # ignore first T_LPAR
      token = lookahead

      case token.symbol
      when T_NUMBER
	thread_tree.add_member(number)
      when T_SPACE
	# do nothing
      when T_LPAR
	subthread = thread_branch(token)
	thread_tree.add_subthread(subthread)
      when T_RPAR
	break
      end
    end

    return thread_tree.root
  end

-- 
前田 修吾

In This Thread