2013-07-17 2 views
0

У меня есть переменная, на которую я устанавливаю значение по умолчанию, а затем выполняю процедуру. Дело в том, что у меня нет доступа к переменной внутри блока, поскольку у блока есть своя собственная переменная и нет доступа к внешней стороне. Вот фрагмент:Рубиновая локальная переменная внутри блока

value = "" 
cmd_errors = Array.new 

# Call the command line 
status = POpen4.popen4(cmd) do |stdout, stderr| 
    output = stdout.read 
    error = stderr.read 
    if (!output.empty?) 
    value = JSON.parse(output)  #This just creates a block scoped variable called 'value' and my local variable is still empty 
    else 
    cmd_errors << error 
    end 
end 

Можно ли разрешить блоку писать эту локальную переменную? Возможно, используя ссылки?

+0

Вы можете использовать 'p output, error' внутри цикла. Кажется, условие 'if' никогда не становится истинным. –

+0

@tolgap: 'p x' эквивалентно' puts x.inspect', поэтому вы не должны писать 'p value.inspect', так как это то же самое, что' puts x.inspect.inspect', который плохо разбирается в вещах. – Borodin

ответ

1

В вашей программе внешняя value переменная : изменен блоком. Обычно назначать nil таким внешним переменным, но то, что у вас есть, будет работать нормально.

Попробуйте изменить значение на что-то еще внутри блока, например, и вы увидите, что переменная изменяется. Я предполагаю, что output.empty? подходит верно.

value = nil 
cmd_errors = Array.new 

status = POpen4.popen4(cmd) do |stdout, stderr| 
    output = stdout.read 
    error = stderr.read 
    value = 'within block' 
    if (!output.empty?) 
    value = JSON.parse(output) 
    else 
    cmd_errors << error 
    end 
end 

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