ruby中沒有嵌套的作用域霉祸,它的作用域之間是分開的,一旦進(jìn)入一個新作用域驾茴,原先的綁定就會被替換為一組新的綁定架专。
作用域門
一般來說,程序會在三個地方關(guān)閉前一個作用域旬痹,同時找開一個新的作用域附井。
它們分別是:class、module两残、def永毅,它們被稱為作用域門。class/module與def還有一點微妙的差別磕昼。在類或module中的代碼會被立即執(zhí)行卷雕。相反,方法中的代碼只有在方法被調(diào)用的時候才執(zhí)行票从。
扁平化作用域
my_var = "abc"
class MyClass
def my_method
end
end
怎么樣在類MyClass中和方法my_method中使用my_var?
答案是這樣的類無法使用my_var,只能改變類和方法的定義方式漫雕。下面來做這件事情:
my_var = "abc"
MyClass = Class.new do
puts?my_var #這里可以使用了
define_method :my_method do
puts?my_var #這里可以使用了
end
end
共享作用域:
假設(shè)想在一組方法之間共享一個變量,這個變量又不想被別的方法訪問峰鄙,就可以把這些方法定義在一個扁平作用域中:
def define_methods
shared = "abc"
Kernel.send :define_method, :my_method1 do
puts shared
end
Kernel.send :define_method, :my_method2 do
puts shared
end
end
instance_eval(): 打開接收者浸间。
代碼塊
從底層看,使用塊需要分兩步:1吟榴、打包備用魁蒜,2、調(diào)用塊(yield)來執(zhí)行代碼吩翻。
在ruby中絕大多數(shù)都是對象兜看,但是塊不是。要存儲一個塊狭瞎,你需要一個對象细移。Proc類可以做到。這個類提供了兩個內(nèi)核方法用于把塊轉(zhuǎn)化為對象:lambda()和proc(),還有兩種方法也能做到:Proc.new()和&操作符熊锭。
lambda()和proc()大多數(shù)情況下可以通用弧轧。但有些區(qū)別:
1雪侥、在lambda中return僅僅從這個lambda中返回,在proc中return是從定義proc的作用域中返回精绎。
2速缨、參數(shù)數(shù)量:lambda中如果參數(shù)數(shù)量不對,會失敗代乃,拋出一個ArgumentError的錯誤旬牲。而proc會把傳來的參數(shù)調(diào)整為自己期望的參數(shù)形式。