Ruby 在堆栈/流对象中存储信息

Ruby 在堆栈/流对象中存储信息,ruby,shoes,Ruby,Shoes,假设我有以下类型的应用程序: Shoes.app do @i = 0 def add_button button ("#{@i += 1}") end button("0") {add_button} end 因此,每次单击按钮时,它都会添加一个编号更高的新按钮。有没有办法对其进行编码,以便单击其中一个新按钮显示其编号?因为self总是指向应用程序,所以显而易见的方法是 button ("#{@i += 1}") {alert @i} 不起

假设我有以下类型的应用程序:

Shoes.app do
    @i = 0

    def add_button
        button ("#{@i += 1}")
    end

    button("0") {add_button}
end
因此,每次单击按钮时,它都会添加一个编号更高的新按钮。有没有办法对其进行编码,以便单击其中一个新按钮显示其编号?因为
self
总是指向应用程序,所以显而易见的方法是

button ("#{@i += 1}") {alert @i}

不起作用,因为单击任何按钮只显示
@i

的当前值
按钮
方法是否返回按钮实例?如果是这样,那么您可以在创建按钮时将整数作为实例变量分配给按钮。这可能会起作用,但尝试这样做的明显方式是为应用程序创建实例变量,而不是按钮。它起作用的原因是
n
是一个局部变量,Ruby中的块是闭包。每次调用
add_按钮
方法都会创建一个新的本地
n
变量,但该变量在方法完成后不会消失,因为传递给
按钮的块
在其上方关闭并保留其引用。
Shoes.app do
    @i = 0

    def add_button
        n = @i+1
        button ("#{@i += 1}") {alert n}
    end

    button("0") {add_button}
end