2016-01-07 61 views
0

我希望這個代碼中插入四個變量(所有隻包含數字字符)插入到表中的SQLite數據庫:問題與Ruby的變量

on :"1" do |m| 
    local  = m.params[1] 
    local_max = m.params[2] 
end 

on :"2" do |m| 
    global  = m.params[1] 
    global_max = p m.params[2] 
    db.execute("insert into t (local, local_max, global, global_max) values(#{local}, #{local_max}, #{global}, #{global_max})") 
end 

而是,它會產生一些錯誤:

> [2016/01/07 20:43:09.662] !! bot.rb:88:in `block (4 levels) in 
> <main>': undefined local variable or method `local' for 
> #<Cinch::Callback:0x00000000c4fe00 @bot=#<Bot nick="cinch">> (NameError) 
+0

你確定你想要塊內的'db.execute'行,而不是外部? –

+0

是的,我知道,因爲我知道塊內已經設置了所有4個變量。 – user5603796

+0

我不知道,什麼'on..'事情做,但它只會工作,如果這些'on'塊共享相同的範圍。否則,你有足夠的錯誤 - 你不能訪問局部變量超出其定義的範圍 –

回答

0

局部變量被稱爲局部的原因 - 它們只在定義範圍內可見。

您正嘗試訪問另一個塊中定義的局部變量,這會引發足夠的異常。

+0

那麼使用@variable? – user5603796

+0

@ user5603796,你可以在更高的範圍內(在兩個塊之前)定義local和local_max,並且所有東西都可以工作。 –

+0

爲什麼downvote,如果我可能會問? –

2

變量locallocal_max僅存在於第一個塊(第一個do ... end)的範圍內。

「聲明」中的變量外塊,然後讓該塊捕捉他們應該足夠:

local, local_max = nil, nil 
on :"1" do |m| 
    local  = m.params[1] 
    local_max = m.params[2] 
end 

on :"2" do |m| 
    global  = m.params[1] 
    global_max = p m.params[2] 
    db.execute("insert into t (local, local_max, global, global_max) values(#{local}, #{local_max}, #{global}, #{global_max})") 
end 

我(和其他人一樣,看起來是)不知道是什麼on,但值得注意的如果on執行了任何改變所提供的塊的範圍的花式元編程,這可能不起作用。

+0

範圍界定發生在句法層面。什麼是幻想元編程的例子可能會改變變量的詞法範圍? – drhining

+0

@drhining:那是我越來越困惑。更改方法和實例變量的範圍非常簡單。這是可能的,但使用綁定(我認爲)。 – Linuxios