From: Masao M. <mu...@hi...> - 2003-10-27 17:21:47
|
むとうです。 仕事忙しくなってきて疲れてるので手短に(^^;)。 On Tue, 28 Oct 2003 01:02:39 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > さかいです。 > > ・signal_overrideのdo_clickedが突然現れ、do_clickedの意味が > > ちょっとわかりづらい気がする。 > > #もちろん、register_typeを知ってれば気にならないと言う人 > > #もいるとは思いますが。 > > > 逆に、以下のような記法はどうでしょうか。 > > > > signal_override("clicked") {|args,...| > > : > > super > > : > > } > > signal_new("hoge", ..... ){|args,...| > > : > > } > > > これでdo_*のようなメソッドを定義する必要もなくブロック内の > > ロジックの使用用途が見た目上、限定できるような気がします。 > > 現在のRubyでやろうとすると、以下のような問題点があるので、 > おそらく無理です。 なるほど。 > > > # 新しいプロパティの作成 > > > install_property(GLib::Param::Int.new("fuga", # name > > > "Fuga", # nick > > > "fuga hoge", # blurb > > > 0, # min > > > 10000, # max > > > 0, # default > > > GLib::Param::READABLE | > > > GLib::Param::WRITABLE)) > > > # プロパティの実装 > > > def fuga > > > puts "MyButton#fuga is called" > > > @fuga > > > end > > > def fuga=(arg) > > > puts "MyButton#fuga= is called" > > > @fuga = arg > > > end > > > end > > > > これって、def fugaとfuga=は必要ですか? > > 上記の形でinstall_propertyを読んだら、 > > 1. @fugaというインスタンス変数が定義される > > 2. fuga, fuga=, set_fugaが生成される > > の2つを自動で行うのが良いと思うのですがいかがでしょうか? > > #実装上難しいのかな。 > > インスタンス変数を使って実装するかどうかはプロパティの実装者が決めることなので、 > 自動的に行うのは良くないと思います。 > > > あり? > > そういえばこの場合、@fugaって定義する必要ありましたっけ? > > 通常、propertiesってsetter/getterはあるけどインスタンス変数 > > としては存在しないと思ってたのですが、そうではない? > > クラスの実装側がsetter/getterを定義します。 > Cで定義されたクラスではCでsetter/getterが定義されていましたが、 > Rubyでクラスを定義するのでRuby側でsetter/getterを用意します。 それってCで定義されたプロパティと一貫性が無くなる気がするのですが...。 require 'gtk2' Gtk.init class MyButton < Gtk::Button register_type("MyButton") def initialize(label = nil) super("label" => label) @fuga = 0 end install_property(GLib::Param::Int.new("fuga", "Fuga", "fuga hoge", 0, 10000, 0, GLib::Param::READABLE | GLib::Param::WRITABLE)) def fuga; @fuga; end def fuga=(arg); @fuga = arg ; end def set_fuga(arg); @fuga = arg; end end class MyButton2 < MyButton def initialize super("Test") set_label("bar") set_fuga("baz") end def result p @label, @fuga end end MyButton2.new.result $ruby test.rb nil "baz" 上記の場合はMyButtonがすぐ上にあるのであまり 違和感がないかもしれませんが、 なんとなく、この結果は同じレベルのものを期待したいような気がします。 -- .:% Masao Mutoh<mu...@hi...> |