国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

簡(jiǎn)要解讀Ruby面向?qū)ο缶幊讨械淖饔糜?/h1>
2019-10-26 19:28:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

作用域

Ruby中不具備嵌套作用域(即在內(nèi)部作用域,可以看到外部作用域的)的特點(diǎn),它的作用域是截然分開(kāi)的,一旦進(jìn)入一個(gè)新的作用域,原先的綁定會(huì)被替換為一組新的綁定。

程序會(huì)在三個(gè)地方關(guān)閉前一個(gè)作用域,同時(shí)打開(kāi)一個(gè)新的作用域,它們是:

類(lèi)定義class 模塊定義 module 方法定義 def

上面三個(gè)關(guān)鍵字,每個(gè)關(guān)鍵字對(duì)應(yīng)一個(gè)作用域門(mén)(進(jìn)入),相應(yīng)的end則對(duì)應(yīng)離開(kāi)這道門(mén)。

扁平化作用域

從一個(gè)作用域進(jìn)入另一個(gè)作用域的時(shí)候,局部變量會(huì)立即失效,為了讓局部變量持續(xù)有效,可以通過(guò)規(guī)避關(guān)鍵字的方式,使用方法調(diào)用來(lái)代替作用域門(mén),讓一個(gè)作用域看到另一個(gè)作用域里的變量,從而達(dá)到目的。具體做法是,通過(guò)Class.new替代class,Module#define_method代替def,Module.new代替module。這種做法稱(chēng)為扁平作用域,表示兩個(gè)作用域擠壓到一起。

示例代碼(Wrong)

my_var = “Success”class MyClass  puts my_var #這里無(wú)法正確打印”Success”  def my_method    puts my_var #這里無(wú)法正確打印”Success”  endend

示例代碼(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”  endend

在一些語(yǔ)言中,比如java或C#,有內(nèi)部作用域(inner scope)的概念。在內(nèi)部作用域可以看到外部作用域(outer scope)中的變量。但ruby中沒(méi)有這種嵌套式作用域的概念,它的作用域是截然分開(kāi)的,一旦進(jìn)入一個(gè)新的作用域,原先的綁定就會(huì)被替代為一組新的綁定。

在ruby中,程序會(huì)在三個(gè)地方關(guān)閉前一個(gè)作用域,同時(shí)打開(kāi)一個(gè)新的作用域:類(lèi)定義、模塊定義、方法。

只要程序進(jìn)入類(lèi)、模塊或者方法的定義,就會(huì)發(fā)生作用域切換。這三個(gè)邊界分別用class,module和def關(guān)鍵字作為標(biāo)志,每一個(gè)關(guān)鍵字都充當(dāng)了一個(gè)作用域門(mén)(scope gate)。

怎樣讓綁定穿越一個(gè)作用域門(mén)呢?比如下面的代碼:

my_var = “hello”class MyClass     #你希望在這里能打印my_var     def my_method          #...還有這里     endend

在進(jìn)入另一個(gè)作用域時(shí),局部變量會(huì)立刻失效。如果把class關(guān)鍵字替換為某個(gè)非作用域門(mén)的東西,比如方法,就能在一個(gè)閉包中獲得my_var的值,并把這個(gè)閉包傳遞給該方法。代碼如下:

my_var = “hello”MyClass = Class.new do     puts “#{my_var} in the class definition”     def my_method          #...這里怎樣打印出來(lái)呢?     endend

用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”     endend MyClass.new.my_method            
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

主站蜘蛛池模板: 南澳县| 夏河县| 垦利县| 新郑市| 红桥区| 台北市| 焉耆| 安远县| 常熟市| 开平市| 剑阁县| 佛学| 东光县| 武强县| 云霄县| 老河口市| 桃江县| 福鼎市| 昔阳县| 江门市| 连南| 天全县| 颍上县| 保山市| 登封市| 白山市| 平远县| 仁怀市| 朝阳县| 逊克县| 钟祥市| 封开县| 松溪县| 定州市| 台湾省| 南昌市| 永州市| 潍坊市| 尉氏县| 扬中市| 乐山市|