2013-07-17 57 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'。似乎'如果'情況永遠不會成真。 –

+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