Обувь 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.