簡要解讀Ruby面向?qū)ο缶幊讨械淖饔糜?/h1>
更新時間:2016年05月19日 15:52:22 作者:日拱一卒
作用域在面向?qū)ο缶幊讨惺且粋€十分重要的概念,程序構(gòu)建時必須要理解清楚類和方法以及對象的作用范圍,接下來就為大家簡要解讀Ruby面向?qū)ο缶幊讨械淖饔糜?/div>
作用域
Ruby中不具備嵌套作用域(即在內(nèi)部作用域,可以看到外部作用域的)的特點,它的作用域是截然分開的,一旦進(jìn)入一個新的作用域,原先的綁定會被替換為一組新的綁定。
程序會在三個地方關(guān)閉前一個作用域,同時打開一個新的作用域,它們是:
- 類定義class
- 模塊定義 module
- 方法定義 def
上面三個關(guān)鍵字,每個關(guān)鍵字對應(yīng)一個作用域門(進(jìn)入),相應(yīng)的end則對應(yīng)離開這道門。
扁平化作用域
從一個作用域進(jìn)入另一個作用域的時候,局部變量會立即失效,為了讓局部變量持續(xù)有效,可以通過規(guī)避關(guān)鍵字的方式,使用方法調(diào)用來代替作用域門,讓一個作用域看到另一個作用域里的變量,從而達(dá)到目的。具體做法是,通過Class.new替代class,Module#define_method代替def,Module.new代替module。這種做法稱為扁平作用域,表示兩個作用域擠壓到一起。
示例代碼(Wrong)
my_var = “Success”
class MyClass
puts my_var #這里無法正確打印”Success”
def my_method
puts my_var #這里無法正確打印”Success”
end
end
示例代碼(Right)
my_var = “Success”
MyClass = Class.new do
puts “#{my_var} in the class definition”
define_method :my_method do
“#{my_var} in the method”
end
end
在一些語言中,比如java或C#,有內(nèi)部作用域(inner scope)的概念。在內(nèi)部作用域可以看到外部作用域(outer scope)中的變量。但ruby中沒有這種嵌套式作用域的概念,它的作用域是截然分開的,一旦進(jìn)入一個新的作用域,原先的綁定就會被替代為一組新的綁定。
在ruby中,程序會在三個地方關(guān)閉前一個作用域,同時打開一個新的作用域:類定義、模塊定義、方法。
只要程序進(jìn)入類、模塊或者方法的定義,就會發(fā)生作用域切換。這三個邊界分別用class,module和def關(guān)鍵字作為標(biāo)志,每一個關(guān)鍵字都充當(dāng)了一個作用域門(scope gate)。
怎樣讓綁定穿越一個作用域門呢?比如下面的代碼:
my_var = “hello”
class MyClass
#你希望在這里能打印my_var
def my_method
#...還有這里
end
end
在進(jìn)入另一個作用域時,局部變量會立刻失效。如果把class關(guān)鍵字替換為某個非作用域門的東西,比如方法,就能在一個閉包中獲得my_var的值,并把這個閉包傳遞給該方法。代碼如下:
my_var = “hello”
MyClass = Class.new do
puts “#{my_var} in the class definition”
def my_method
#...這里怎樣打印出來呢?
end
end
用Module#define_method()方法可以替代def,代碼如下:
my_var = “hello”
MyClass = Class.new do
puts “#{my_var} in the class definition”
define_method :my_method do
puts “#{my_var} in the method”
end
end
MyClass.new.my_method
hello in the class definition
hello in the method
使用方法來替代作用域門,可以讓一個作用域看到另一個作用域中的變量,這種技術(shù)可以稱之為“扁平作用域”。
共享作用域
將一組方法定義到,某個變量的扁平作用域中,可以保證變量僅被有限的幾個方法所共享。這種方式稱為共享作用域。
相關(guān)文章
-
Ruby使用C++擴(kuò)展實例(含C++擴(kuò)展代碼示例)
這篇文章主要介紹了Ruby使用C++擴(kuò)展實例,含C++擴(kuò)展實現(xiàn)代碼,本文可作為Ruby中使用C++擴(kuò)展的入門教程,需要的朋友可以參考下 2014-09-09
-
使用Ruby實現(xiàn)簡單的事物驅(qū)動的web應(yīng)用的教程
這篇文章主要介紹了使用Ruby實現(xiàn)簡單的事物驅(qū)動的web應(yīng)用的教程,本文來自于IBM官方技術(shù)文檔,需要的朋友可以參考下 2015-04-04
-
Ruby on Rails實現(xiàn)最基本的用戶注冊和登錄功能的教程
這里我們主要以has_secure_password的用戶密碼驗證功能為中心,來講解Ruby on Rails實現(xiàn)最基本的用戶注冊和登錄功能的教程,需要的朋友可以參考下 2016-06-06
最新評論
作用域
Ruby中不具備嵌套作用域(即在內(nèi)部作用域,可以看到外部作用域的)的特點,它的作用域是截然分開的,一旦進(jìn)入一個新的作用域,原先的綁定會被替換為一組新的綁定。
程序會在三個地方關(guān)閉前一個作用域,同時打開一個新的作用域,它們是:
- 類定義class
- 模塊定義 module
- 方法定義 def
上面三個關(guān)鍵字,每個關(guān)鍵字對應(yīng)一個作用域門(進(jìn)入),相應(yīng)的end則對應(yīng)離開這道門。
扁平化作用域
從一個作用域進(jìn)入另一個作用域的時候,局部變量會立即失效,為了讓局部變量持續(xù)有效,可以通過規(guī)避關(guān)鍵字的方式,使用方法調(diào)用來代替作用域門,讓一個作用域看到另一個作用域里的變量,從而達(dá)到目的。具體做法是,通過Class.new替代class,Module#define_method代替def,Module.new代替module。這種做法稱為扁平作用域,表示兩個作用域擠壓到一起。
示例代碼(Wrong)
my_var = “Success”
class MyClass
puts my_var #這里無法正確打印”Success”
def my_method
puts my_var #這里無法正確打印”Success”
end
end
示例代碼(Right)
my_var = “Success”
MyClass = Class.new do
puts “#{my_var} in the class definition”
define_method :my_method do
“#{my_var} in the method”
end
end
在一些語言中,比如java或C#,有內(nèi)部作用域(inner scope)的概念。在內(nèi)部作用域可以看到外部作用域(outer scope)中的變量。但ruby中沒有這種嵌套式作用域的概念,它的作用域是截然分開的,一旦進(jìn)入一個新的作用域,原先的綁定就會被替代為一組新的綁定。
在ruby中,程序會在三個地方關(guān)閉前一個作用域,同時打開一個新的作用域:類定義、模塊定義、方法。
只要程序進(jìn)入類、模塊或者方法的定義,就會發(fā)生作用域切換。這三個邊界分別用class,module和def關(guān)鍵字作為標(biāo)志,每一個關(guān)鍵字都充當(dāng)了一個作用域門(scope gate)。
怎樣讓綁定穿越一個作用域門呢?比如下面的代碼:
my_var = “hello”
class MyClass
#你希望在這里能打印my_var
def my_method
#...還有這里
end
end
在進(jìn)入另一個作用域時,局部變量會立刻失效。如果把class關(guān)鍵字替換為某個非作用域門的東西,比如方法,就能在一個閉包中獲得my_var的值,并把這個閉包傳遞給該方法。代碼如下:
my_var = “hello”
MyClass = Class.new do
puts “#{my_var} in the class definition”
def my_method
#...這里怎樣打印出來呢?
end
end
用Module#define_method()方法可以替代def,代碼如下:
my_var = “hello”
MyClass = Class.new do
puts “#{my_var} in the class definition”
define_method :my_method do
puts “#{my_var} in the method”
end
end
MyClass.new.my_method
hello in the class definition hello in the method
共享作用域
將一組方法定義到,某個變量的扁平作用域中,可以保證變量僅被有限的幾個方法所共享。這種方式稱為共享作用域。
相關(guān)文章
Ruby使用C++擴(kuò)展實例(含C++擴(kuò)展代碼示例)
這篇文章主要介紹了Ruby使用C++擴(kuò)展實例,含C++擴(kuò)展實現(xiàn)代碼,本文可作為Ruby中使用C++擴(kuò)展的入門教程,需要的朋友可以參考下2014-09-09
使用Ruby實現(xiàn)簡單的事物驅(qū)動的web應(yīng)用的教程
這篇文章主要介紹了使用Ruby實現(xiàn)簡單的事物驅(qū)動的web應(yīng)用的教程,本文來自于IBM官方技術(shù)文檔,需要的朋友可以參考下2015-04-04
Ruby on Rails實現(xiàn)最基本的用戶注冊和登錄功能的教程
這里我們主要以has_secure_password的用戶密碼驗證功能為中心,來講解Ruby on Rails實現(xiàn)最基本的用戶注冊和登錄功能的教程,需要的朋友可以參考下2016-06-06

