[英]Ruby - block scope
我有一個方法,根據情況要采取不同的操作,因此我希望能夠將一個塊傳遞給該方法,並在給出塊的情況下執行。
但是,我對傳入的塊中變量的范圍感到困惑。
例如:
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'
在屈服線上。
能做到嗎?
您需要傳遞局部變量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
從開始到創建塊的所有變量。
回答您的間接問題:
塊按詞法作用域,這意味着它們可以從定義它們的作用域中訪問變量(而不是“使用於”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.