2017-09-13 114 views
0

我試圖創建一個函數來創建一個按鈕(這樣保持「乾淨」的代碼)。功能來創建按鈕

下面是代碼:

(
Window.closeAll; 

~w = Window.new(
    name: "Xylophone", 
    resizable: true, 
    border: true, 
    server: s, 
    scroll: false); 

~w.alwaysOnTop = true; 

/** 
* Function that creates a button. 
*/ 
createButtonFunc = { 
    | 
     l = 20, t = 20, w = 40, h = 190, // button position 
     nameNote = "note", // button name 
     freqs // frequency to play 
    | 

    Button(
     parent: ~w, // the parent view 
     bounds: Rect(left: l, top: t, width: w, height: h) 
    ) 
    .states_([[nameNote, Color.black, Color.fromHexString("#FF0000")]]) 
    .action_({Synth("xyl", [\freqs, freqs])}); 
} 
) 


(
SynthDef("xyl", { 
    | 
     out = 0, // the index of the bus to write out to 
     freqs = #[410], // array of filter frequencies 
     rings = #[0.8] // array of 60 dB decay times in seconds for the filters 
    | 

    ... 
) 

的錯誤是:ERROR:變量 'createButtonFunc' 沒有定義。 爲什麼?

很抱歉,但我是個初學者。

謝謝!

回答

1

可能有點晚了回答這個問題,但我希望這可以幫助別人同樣的問題。

你得到這個錯誤的原因是因爲你使用一個變量名你宣佈之前。

換句話說,如果你嘗試在自己的評價

variableName

,您總能獲得一個錯誤,因爲該解釋無法匹配該名稱別的就知道。要解決此問題,可以在代碼中使用全局解釋器變量(a-z),環境變量(如~createButtonFunc)或聲明var createButtonFunc。請注意,最後一個意思是在解釋該塊之後,您將無法訪問該變量名,這可能是也可能不是一件好事。如果您希望稍後能夠訪問它,我認爲編寫~createButtonFunc是最有意義的。

順便說一句,你可以只使用w,而不是~w;單字母變量名默認是全局的,這就是慣用的用法。

-Brian