From: Hidetoshi NAGAI Date: 2015-03-06T19:44:27+09:00 Subject: [ruby-list:50098] Re: Ruby/Tkでのキャンバス上のアイテム作成 永井@知能.九工大です. From: Naoki Oshiro Subject: [ruby-list:50097] Ruby/Tkでのキャンバス上のアイテム作成 Date: Fri, 6 Mar 2015 17:11:10 +0900 Message-ID: > Ruby/Tkのキャンバス上でのアイテム作成は、各アイテムクラスでインスタンス生成するかと思っていましたが、キャンバスクラスにもcreateメソッドがあったんですね。 はい. キャンバスアイテムを色々と操作する場合には オブジェクトとなっている方が扱いやすいのですが, アイテム生成後の操作が不要であるような場合には オブジェクトの生成は資源の無駄となりがちです. create メソッドは,オブジェクトを生成することなくアイテムを作成するために 用意したものとなります. # create で作っておいて,後からオブジェクト化する手段もあります. # ( create_itemobj_from_id メソッドとか ) > また、PerlやPythonですと、キャンバスのアイテム作成用のメソッド名は create_line などがあるようです。 > > Tcl: .canvas create line 10 10 200 50 > Ruby: TkcLine.new( canvas, 10, 10, 200, 50) > Perl: $canvas->create_line(10,10,200,50); > Python: canvas.create_line(10, 10, 200, 50) > [http://www.tkdocs.com/tutorial/canvas.html TkDocs - Tk Tutorial - Canvas] こうしたメソッドを用意することも考えたのですが, Tk 拡張でアイテムが追加される可能性を鑑みるとキリがないかなとも思って 組み込むことは控えていました. # ただでさえ,メソッドの種類が多いので.(^_^; どうしても欲しければば,monky patch で追加してもらえばいいかなと. > Rubyのキャンバスクラスでも同じようなメソッド名にしてはどうかと、TkCanvas::createで使っているTkcItem::CItemTypeToClassのアイテム名/クラス名の情報を使って次のようにメソッドを定義してみました: > > class TkCanvas > TkcItem::CItemTypeToClass.each do |k, v| > class_eval("def create_#{k}(*args); #{v}.create(self, *args); end") > end > end > > 上記の定義を使うと以下で書けます。 > > c.create_line(10, 30, 100, 30, fill: "green") > > 他との類似も考えて、こちらあたりにしてもいいとも思うのですがいかがでしょうか? ご希望であれば,他にもこういう↓対応方法もありますね. ----------------------------------------------------------- class TkCanvas def method_missing(id, *args) name = id.id2name if name =~ /^create_(.+)/ __send__(:create, $1, *args) else super end end end ----------------------------------------------------------- > また、現行で各アイテムのコンストラクタを使用する場合と、キャンバスのcreateメソッドを使用する場合では推奨されているものはあるでしょうか? 最初に書いたように,アイテムを操作する可能性があるか, わずかであってもオブジェクトが占めるメモリを減らしたいか というところが判断基準だと思っています. -- 永井 秀利 (nagai@ai.kyutech.ac.jp) 九州工業大学大学院情報工学研究院知能情報工学研究系知能情報メディア部門助教