[ruby-list:50098] Re: Ruby/Tkでのキャンバス上のアイテム作成
From:
Hidetoshi NAGAI <nagai@...>
Date:
2015-03-06 10:44:27 UTC
List:
ruby-list #50098
永井@知能.九工大です.
From: Naoki Oshiro <oshiro@mibai.tec.u-ryukyu.ac.jp>
Subject: [ruby-list:50097] Ruby/Tkでのキャンバス上のアイテム作成
Date: Fri, 6 Mar 2015 17:11:10 +0900
Message-ID: <CANd9fdDydqBs=kkpyrWGx4RRqro-GT3UVxzdJ8k=rDsNpc2erQ@mail.gmail.com>
> 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)
九州工業大学大学院情報工学研究院知能情報工学研究系知能情報メディア部門助教