我希望这段代码将四个变量(全部只包含数字字符)插入到SQLite数据库的表中:
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 :(得分:2)
变量local
和local_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
做任何改变所提供块的范围的奇特元编程,这可能不会工作。
答案 1 :(得分:0)
局部变量因为原因而被称为局部变量 - 它们仅在定义范围内可见。
您正在尝试访问另一个块中定义的局部变量,这会抛出足够的异常。