Как вызвать методы Shoes из метода экземпляра? - PullRequest
2 голосов
/ 02 января 2011

Я пытаюсь расширить приложение Ruby, которое я уже написал, для использования 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() открывается новое окно.

Как я могу рисовать вещи, используя обувь из метода экземпляра?

Ответы [ 2 ]

4 голосов
/ 02 января 2011

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
}
1 голос
/ 02 января 2011

Что вы можете сделать, это отделить графический интерфейс от чертежа.Причина, по которой новые окна открываются каждый раз, заключается в том, что 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
...