Ruby Shoes4:Sample13如何工作?

时间:2013-07-23 22:00:58

标签: ruby jruby shoes

我最近重新发现了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

我想解释一下这段代码是如何工作的。

似乎创建的每个图形都存储在某处,但究竟在哪里?有没有办法访问新创建的数字集合?

此外,如图所示,还会添加一个图形,例如单击发布。这是鞋子中每个对象的情况(我在鞋子网站上找不到)?

1 个答案:

答案 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需要,但我似乎记得我们在其他地方遇到过问题。我会尝试调查并打开问题,但这里不太重要: - )

哦,谢谢你试穿鞋子! :-)另外,谢谢你告诉我你实际上可以拖动它们,我甚至都不知道!