2011-01-01 9 views
2

私はすでに靴を使用するために書いたRubyアプリケーションを拡張しようとしています。私はすでに書いたクラスがあり、そのクラスでGUIを使用できるようにしたいと考えています。それが何かを描画したい場合インスタンスメソッド内からShoesメソッドを呼び出す方法は?

class MyClass 
    def draw 
    # draw something using Shoes 
    end 
end 

MyClass内の別の方法は、draw()を呼び出します:それは、私は私のクラスは、このような何かをしたい、です。

私はこれをいくつかの方法でやってみましたが、どれもうまくいかないようです。私は靴のアプリでクラス全体をラップすることができました。

Shoes.app { 
    class MyClass 
    def draw 
     oval :top => 100, :left => 100, :radius => 30 
    end 
    end 
} 

しかし、それはundefined method 'oval' for MyClassと書いてあります。

は、私も試してみましたこの:

class MyClass 
    def draw 
    Shoes.app { 
     oval :top => 100, :left => 100, :radius => 30 
    } 
    end 
end 

これが正常に実行されますが、それは毎回test()が呼び出された新しいウィンドウが開きます。

インスタンスメソッド内から靴を使用して物を描くにはどうすればよいですか?

答えて

4

Shoes.app { ... }は、コードブロックのinstance_evalをを行います。つまり、ブロックのボディは、自分自身がShoes(またはそれがどのようなクラスでもフードの中で使用している)のインスタンスであるかのように実行されます。あなたがしたいことは次のようなものです:

class MyClass 
    def initialize(app) 
    @app = app 
    end 
    def draw 
    @app.oval :top => 100, :left => 100, :radius => 30 
    end 
end 

Shoes.app { 
    myclass = MyClass.new(self) # passing in the app here 
    myclass.draw 
} 
1

できることは、GUIと図面を分けることです。毎回新しいウィンドウが開かれるのは、drawメソッドが呼び出されるたびにShoes.appが呼び出されるからです。

これを試してみてください:

class MyClass 
    def draw 
    oval :top => 100, :left => 100, :radius => 30 
    end 
    def test 
    draw 
    end 
end 

Shoes.app do 
    myclass = MyClass.new 
    myclass.test 
end 
+0

このコードは機能しません。理由は分かりませんが、「間違った引数の数(0の場合は1)」と表示されます。 –

関連する問題