Ruby变量的问题

时间:2016-01-07 20:43:50

标签: ruby

我希望这段代码将四个变量(全部只包含数字字符)插入到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)

2 个答案:

答案 0 :(得分: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做任何改变所提供块的范围的奇特元编程,这可能不会工作。

答案 1 :(得分:0)

局部变量因为原因而被称为局部变量 - 它们仅在定义范围内可见。

您正在尝试访问另一个块中定义的局部变量,这会抛出足够的异常。