2015-11-02 120 views
2

我有一種方法,我希望根據場景採取不同的行爲,所以我希望能夠將塊傳遞給方法,並在塊給出時執行。紅寶石 - 塊範圍

然而,我通過在我傳遞在塊中的變量的範圍混淆

,例如:

def original_method (a, b, opt = {id: nil, id_map: {}}) 
    element_id = (opt[:id_map]) 

    yield if block_given? 

end 

並且穿過該塊中的新方法:

def new_method(a, b, opt) 
original_method (a, b, opt) do 
    if(element_id.include? "some text") 
    puts "it has some text" 
    end 
end 
end 

但我得到錯誤:

undefined local variable or method `element_id' 

在收益率線。

可以這樣做嗎?

+0

您在'(opt [:id_map]'後面缺少右括號' – Cyzanfar

回答

5

您需要通過局部變量element_id,作爲yield的參數。

def original_method (a, b, opt = {id: nil, id_map: {}}) 
    element_id = opt[:id_map] 
    yield(element_id) if block_given? # pass it as argument 
end 

然後接受它喜歡:

def new_method(a, b, opt) 
original_method (a, b, opt) do | element_id | # receive as block pramater 
    if(element_id.include? "some text") 
    puts "it has some text" 
    end 
end 
end 

element_id局部變量已方法original_method內創建的,這就是爲什麼它僅僅是這個方法的內部訪問。

裏面的方法new_method,當你調用的方法original_method重視它,由於關閉能力,它已經從王建宇,山西高等學校的地步塊訪問方法new_method內的所有變量創建。

1

回答你的問題,間接:

塊的作用域詞彙,這意味着他們必須從他們的定義(而不是「中使用的」)範圍內訪問變量。