2016-01-07 2 views
0

Я ожидаю, что этот код для вставки четыре переменные (которые содержат только числовые символы) в таблицу в 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

Вы уверены, что хотите, чтобы строка 'db.execute' внутри блока, а не снаружи? –

+0

Да, я знаю, потому что я знаю, что в блоке установлены все 4 переменные. – user5603796

+0

Я не знаю, что делает 'on..', но это будет работать, только если эти блоки' on' имеют одну и ту же область. В противном случае у вас есть адекватная ошибка: вы не можете получить доступ к локальным переменным за пределами их определения. –

ответ

0

Локальные переменные называются локальными по причине - они видны только в пределах определения.

Вы пытаетесь получить доступ к локальной переменной, определенной в одном блоке от другой, что создает соответствующее исключение.

+0

Итак, используйте @variable? – user5603796

+0

@ user5603796, вы можете определить local и local_max в более высокой области (до двух блоков), и все будет работать. –

+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 выполняет какое-либо причудливое метапрограммирование, которое изменяет область видимости поставляемого блока, это может не сработать.

+0

Охват происходит на синтаксическом уровне. Каков пример фантастического метапрограммирования, который может изменить лексическую область переменных? – drhining

+0

@drhining: это я смутился. Весьма легко изменить область для методов и переменных экземпляра. Возможно, хотя, используя привязки (я думаю). – Linuxios

Смежные вопросы