2

すでに作成したRubyアプリケーションをShoesを使用するように拡張しようとしています。すでに作成したクラスがあり、そのクラスでGUIを使用できるようにしたいと考えています。つまり、クラスに次のようなものを持たせたいのです。

class MyClass
   def draw
    # draw something using Shoes
  end
end

内部の別のメソッドは、何かを描画したいときにMyClass呼び出します。draw()

私はこれをいくつかの方法で試しましたが、どれもうまくいかないようです。クラス全体をShoesアプリでラップすることができます。楕円形を描きたいとしましょう:

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()これは正常に実行されますが、が呼び出されるたびに新しいウィンドウが開きます。

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

4

2 に答える 2

4

Shoes.app { ... }コード ブロックの instance_eval を実行します。これが意味することは、ブロックの本体が、self が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
}
于 2011-01-01T22:22:22.840 に答える
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
于 2011-01-01T22:01:54.277 に答える