青山です。

On Thu, May 23, 2002 at 12:52:10PM +0900,
 Tanaka Akira wrote:

> > 内容要素のチェックを private, public で行うタイプのベースができてきた
> 
> ふと思ったのですが、これをナイーブにやるとスレッドセーフにならないよう
> な気がするんですが、実際のところどうなんでしょう?
> 
> まぁ、CGI で使うだけならスレッドセーフでなくてもいい気もしますが。

あ、いえ、ご指摘の通りです。mod_ruby での使用が出来なくなりますね。

def foo_entity; end
instance_eval("alias foo foo_entity")
instance_eval("undef foo")

この組合せに変更しようと思います。foo_entity() を定義しておいて、イン
スタンス内でだけ、alias, undef で、利用する名前を用意、削除する、とい
う感じです。

これなら影響はそのインスタンス内だけになると思われるので(簡単なテスト
では、期待する動きになるようですし)、複数生成にも、スレッド利用にも対
応できそうな気がします。

(というか、やはり self のすり替えが便利そうだったので、すでに alias,
undef に変更した所でしたから、この対応はすぐに出来そうです。)

という事で、現在のインターフェイスとしては、こんな感じです。


require "cgi"
cgi = CGI.new
require "cgi/session"
session = CGI::Session.new(cgi)
require "html/html3"
html = HTML::Html3.new(cgi) do
  html("pretty") do
    head{ title{"TITLE"} }
    body do
      h1{"head 1"}
      p do
        self << "Ruby's home page is "
        a("url"){"here"}
        self << "."
      end
      p do
        self << "Ruby's home page is " << a("href"=>"url"){"here"} << "."
      end
      form do
        textarea("field_name")
        br
        submit
      end
    end
  end
end
cgi.out(html.to_s)


CGI::Session のセッション情報の埋め込みは、CGI::Session.new(cgi) とい
うインターフェイスを取り入れて、HTML::Html3.new(cgi) としてみました。
こうして事前に渡しておくと、form() での埋め込みが素直にできて良いよう
です。

このような感じで、cgi.rb, cgi/session.rb には手を加えず、そのまま追加
して使えるライブラリになりそうです。

あ、pretty の指定は html() よりも new() の方がいいかもしれませんね。


-- 
青山 和光 Wakou Aoyama  <wakou / ruby-lang.org>