我最近重新发现了Ruby Shoes框架,它是一个很小的图形框架,使用Ruby内部DSL功能,更具体地说是Shoes4。
其中一个例子(位于./samples)特别让我印象深刻: sample13.rb ,我无法完全理解。
运行此示例,您将获得一个带有名为“new”的按钮的画布。每次按下此按钮,都会在画布中添加一个新图形(程序中的命名框)(具有随机形状和颜色)。但更重要的是,您可以在之后单击这些数字,然后将它们移开。
代码非常简短:
Shoes.app :width => 300, :height => 300 do
COLORS = Shoes::COLORS
i = 45
button 'new' do
i += 5
box = rand(2) == 0 ? rect(i, i, 20) : oval(i, i, 20)
box.style :fill => send(COLORS.keys[rand(COLORS.keys.size)])
@flag = false
box.click{@flag = true; @box = box}
box.release{@flag = false}
end
motion{|left, top| @box.move(left-10, top-10) if @flag}
end
我想解释一下这段代码是如何工作的。
似乎创建的每个图形都存储在某处,但究竟在哪里?有没有办法访问新创建的数字集合?
此外,如图所示,还会添加一个图形,例如单击和发布。这是鞋子中每个对象的情况(我在鞋子网站上找不到)?
答案 0 :(得分:2)
所以这些数字并没有存储在任何地方,但是还有一些范围的魔术正在进行中。 click和release元素在很多元素中都可用,它应该是here under :click提到的所有元素,但在Shoes4中尚未完全支持该列表。
让我们逐一看一下:
box.click{@flag = true; @box = box}
box.release{@flag = false}
因此,当单击一个元素时@flag
设置为true(该标志似乎标记当前正在拖动一个元素),这就是释放鼠标单击时将该标志设置为false的原因。此外,单击时发生的情况是实例变量@box
设置为刚刚单击的框。这是可能的,因为块保留了它们创建的范围。这意味着范围记住box
指的是在单击框时调用的块的创建框。这是可能的,因为在创建块期间,引用将保存在局部变量box
中,并且块会捕获此范围。
现在动议:
motion{|left, top| @box.move(left-10, top-10) if @flag}
Motion捕捉鼠标的移动。它的作用是将当前单击的框(如果有,因此@flag
)移动到当前鼠标光标的位置(由顶部和左侧指定)。我不知道为什么-10需要,但我似乎记得我们在其他地方遇到过问题。我会尝试调查并打开问题,但这里不太重要: - )
哦,谢谢你试穿鞋子! :-)另外,谢谢你告诉我你实际上可以拖动它们,我甚至都不知道!