2011-01-01 6 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

코드가 작동하지 않습니다. 왜 그런지는 모르지만 그것은 잘못된 인수의 수 (1에 대해 0)라고 말합니다. –

관련 문제