Обувь 4, не может вызывать объекты за пределами основного приложения

Я разрабатываю действительно простое приложение в Ruby и решил использовать Обувь Gui, я пытаюсь использовать новую четвертую версию, но я не могу называть предметы для обуви вне приложения, например, в Руководстве по обуви http://shoesrb.com/manual/Rules.html этот код не работает:

class Messenger
 def initialize(stack)
 @stack = stack
 end
 def add(msg)
 @stack.append do
 para msg
 end
 end
 end

когда я пропускаю объект стека из приложения, ничего не происходит, спасибо за вашу помощь

2 ответа

У меня была такая же проблема, как описано здесь, но с правильной частью кода из руководства. Я что-то нашел, поэтому я размещаю его здесь, надеясь, что это поможет кому-то (или что кто-то объяснит мне, что я не нашел).

Вот то, что у меня было в первую очередь (это не работает, независимо от того, где вы помещаете свой экземпляр класса).

class Messenger
 def initialize(stack)
 @stack = stack
 end
 def add(msg)
 @stack.app do
 @stack.append do
 para msg
 end
 end
 end
end

 Shoes.app do
 stack margin: 20, width: 20 do
 subtitle "Shoes box"
 para "Maaamaaaaa"

 button "Mama ?" do
 s = Messenger.new(@box)
 s.add("Yeah, mama !")
 end
 end
 @box = stack
 end

Первое: если вы получили эти два фрагмента кода в одном файле, вы можете сделать это:

class Messenger
 ...
 @stack.app do
 @box.append do
 para msg
 end
 ...
end

Оно работает.

Это не работает, если вы удалите блок @stack.app do или, если вы переместите этот класс в другой файл. Если вы помещаете экземпляр класса в другое место, он тоже не работает.

Более интересный, теперь и работающий, даже если вы помещаете свой класс Messenger в другое место, вы можете сделать это:

class Messenger
 ...
 def add(msg)
 @stack.app do
 para msg
 end
 ...


 Shoes.app do
 ...
 button "Mama ?" do
 @box.append do
 s = Messenger.new(@box)
 s.add("Yeah, mama !")
 end
 end
 ...
 end

Теперь вы также можете перенести экземпляр класса в любом месте вашего блока приложений... но он все равно должен быть перед полем, к которому вы пытаетесь подключиться, и тот же самый флажок должен быть объявлен ПЕРЕД кнопкой, которая пытается добавить к Это. Сделать это немного сложно. В противном случае вы можете позволить создать экземпляр класса. Это означает, что вы будете создавать новый объект каждый раз, когда вы пытаетесь добавить что-то в свой ящик. И это уродливо. Но это работает.

Изменение: просто увидели, что вы можете заменить @stack.append на self.append do в классе Messenger. Хотя это действительно ничего не добавляет, поскольку он добавляет msg в начале вашего окна.


Я думаю, вы просто пропустили чтение руководства полностью. В руководстве очень четко сказано, что это, по-видимому, должно работать, но это не так, поскольку объект App больше не существует. К счастью, каждый объект обуви имеет метод приложения, поэтому: вы должны заменить свой код:

class Messenger
 def initialize(stack)
 @stack = stack
 end
 def add(msg)
 @stack.app do
 @stack.append do
 para msg
 end
 end
 end
end

Надеюсь, поможет :)

licensed under cc by-sa 3.0 with attribution.