我正在用Ruby开发一个非常简单的应用程序,并决定使用Shoes Gui,尝试使用新的第四版,但是我无法在应用程序外部调用shoe对象,例如,在Shoes手册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
当我从应用程序传递堆栈对象时,什么都没有发生,谢谢您的帮助
我认为您只是完全错过了阅读手册的机会。该手册非常清楚地表明,这显然应该可以工作,但是由于App对象不再存在,因此不可行。幸运的是,每个shoes对象都有一个app方法,因此:您应该将代码替换为:
class Messenger
def initialize(stack)
@stack = stack
end
def add(msg)
@stack.app do
@stack.append do
para msg
end
end
end
end
希望有帮助:)
我在这里描述了相同的问题,但是使用了手册中的正确代码。我已经找到了一些东西,所以我将其发布在这里,希望它能对某人有所帮助(或者有人会向我解释我not发现的东西)。
这是我刚学的(无论您将类实例放在何处,它都行不通。
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
现在,您也可以将类实例化移动到您的应用程序块中的任何位置...,但是它仍必须在您要附加到该框之前,并且必须在试图添加该按钮之前声明相同的框。添加到它。使事情变得有些棘手。否则,您可以在这里让您的类实例化。这意味着您每次尝试向框添加内容时都会创建一个新对象。而且很丑。但这有效。
编辑:刚刚看到,您可以在Messenger类中将@stack.append
替换为self.append do
。尽管它实际上并没有添加任何内容,但是由于它是在窗口的开头添加了味精。
首先,将class Messenger
更改为class Messenger < Shoes
。对于鞋类中的所有课程,这都是必不可少的。然后,将Shoes.app
语句放在类的end
语句之后,但不要添加do
。您的代码应如下所示:
class Messenger < Shoes
# Your code goes here...
end
Shoes.app [styling goes here]
注意:在定义所有类之后,最后只将Shoes.app
放置一次。