我在Ruby中开发了一个非常简单的应用程序,并决定使用Shoes Gui,我试图使用新的第四个版本,但我不能在应用程序之外调用鞋子对象,例如在鞋子手册http://shoesrb.com/manual/Rules.html中此代码没有& #39; t work:
class Messenger
def initialize(stack)
@stack = stack
end
def add(msg)
@stack.append do
para msg
end
end
end
当我从应用程序传递堆栈对象时,没有任何反应,感谢您的帮助
答案 0 :(得分:0)
我认为你完全错过了阅读手册。该手册非常清楚地表明,这显然应该可行,但它不会因为App对象不再存在。幸运的是,每个鞋子对象都有一个app方法,所以: 您应该用以下代码替换您的代码:
class Messenger
def initialize(stack)
@stack = stack
end
def add(msg)
@stack.app do
@stack.append do
para msg
end
end
end
end
希望有所帮助:)
答案 1 :(得分:0)
我遇到了与此处描述的相同的问题,但是使用了手册中的正确代码。我找到了一些东西,所以我在这里发帖,希望它可以帮助某人(或者有人会解释我 找不到的东西)。
这是我的第一次(无论你在哪里进行类实例化,它都无法工作)。
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
现在你也可以在你的app块中的任何地方移动你的类实例...但它仍然必须在你试图追加的框之前,并且必须在按钮之前声明相同的框。正试图加入它。让事情变得有点棘手。否则,你可以让你的类在这里实例化。这意味着每次您尝试将某些东西附加到盒子上时,您都会创建一个新对象。这很难看。但它确实有效。
编辑:只是看到了,您可以在Messenger类中替换@stack.append
来自self.append do
。虽然它并没有真正附加任何东西,因为它在你窗口的开头添加了msg。
答案 2 :(得分:0)
首先,将class Messenger
更改为class Messenger < Shoes
。对于鞋类中的所有课程,这都是必不可少的。然后,将Shoes.app
语句放在类的end
语句之后,但不要添加do
。您的代码应如下所示:
class Messenger < Shoes
# Your code goes here...
end
Shoes.app [styling goes here]
注意:在定义所有类之后,仅将Shoes.app
放在最后一次。