2013-07-23 47 views
2

我最近重新發現了Ruby Shoes框架,它是一個小圖形框架,使用Ruby內部DSL功能,更具體地說是Shoes4Ruby Shoes4:Sample13如何工作?

其中一個例子(位於./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 

我想這個代碼是如何工作的解釋。

似乎每個創建的圖都存儲在某個地方,但究竟在哪裏?有沒有辦法獲得新創建的人物的收藏?

此外,如圖所示,還增加了一個數字方法,如點擊版本。一般情況下,鞋子中的每個對象都是這種情況(我無法在Shoes網站上找到)?

回答

2

所以這些數字並沒有存儲在任何地方,但是有相當一些範圍的魔法正在進行。點擊和釋放元素在相當一些元素上可用,它應該是所提到的所有元素here under :click,但Shoes4尚未完全支持該列表。

那麼讓我們來看看這一個接一個:

box.click{@flag = true; @box = box} 
box.release{@flag = false} 

元素被點擊@flag因此,當設置爲true(該標誌似乎標誌着一個元件目前正在拖動),這就是爲什麼當鼠標點擊被釋放時,標誌被設置爲假。此外,點擊發生的是實例變量@box設置爲剛纔單擊的框。這是可能的,因爲塊保留它們的創建範圍。這意味着範圍記住box引用在單擊框時調用的塊的創建框。這是可能的,因爲在創建塊期間將引用保存在局部變量box中,並且該塊捕獲該範圍。

所以,現在的運動:

motion{|left, top| @box.move(left-10, top-10) if @flag} 

動作捕捉鼠標的移動。它執行的操作會將當前點擊的框(如果有任何,因此@flag)移動到當前鼠標光標的位置(由頂部和左側指定)。我不知道爲什麼需要-10,但我似乎記得我們在其他地方有問題。我會盡力調查和解決問題,但這不是太重要:-)

哦,謝謝你嘗試鞋! :-)再加上感謝告訴我,你實際上可以拖動那些,我甚至不知道!

+0

好的。不平凡的部分是關於範圍機制,目前尚不清楚,所以我不願意驗證你的答案。 – JCLL

+0

我只是試圖擴大一些塊的範圍。這是否解釋了它?如果沒有 - 還不清楚? – PragTob

+0

我還是沒有明白。在執行過程中,局部變量(如框)被刪除,在塊的結尾,不是?所以通常(正如我瞭解Ruby),只有最後一個受到@box(instance)影響的盒子才能被移動(在「motion」方法中)。 – JCLL