簡體   English   中英

Ruby-塊范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM