簡要解讀Ruby物件導向編程中的範圍_ruby專題

來源:互聯網
上載者:User

範圍

Ruby中不具備嵌套範圍(即在內部範圍,可以看到外部範圍的)的特點,它的範圍是截然分開的,一旦進入一個新的範圍,原先的綁定會被替換為一組新的綁定。

程式會在三個地方關閉前一個範圍,同時開啟一個新的範圍,它們是:

  • 類定義class
  • 模組定義 module
  • 方法定義 def

上面三個關鍵字,每個關鍵字對應一個範圍門(進入),相應的end則對應離開這道門。

扁平化範圍

從一個範圍進入另一個範圍的時候,局部變數會立即失效,為了讓局部變數持續有效,可以通過規避關鍵字的方式,使用方法調用來代替範圍門,讓一個範圍看到另一個範圍裡的變數,從而達到目的。具體做法是,通過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”  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

在一些語言中,比如java或C#,有內部範圍(inner scope)的概念。在內部範圍可以看到外部範圍(outer scope)中的變數。但ruby中沒有這種嵌套式範圍的概念,它的範圍是截然分開的,一旦進入一個新的範圍,原先的綁定就會被替代為一組新的綁定。

在ruby中,程式會在三個地方關閉前一個範圍,同時開啟一個新的範圍:類定義、模組定義、方法。

只要程式進入類、模組或者方法的定義,就會發生範圍切換。這三個邊界分別用class,module和def關鍵字作為標誌,每一個關鍵字都充當了一個範圍門(scope gate)。

怎樣讓綁定穿越一個範圍門呢?比如下面的代碼:

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

在進入另一個範圍時,局部變數會立刻失效。如果把class關鍵字替換為某個非範圍門的東西,比如方法,就能在一個閉包中獲得my_var的值,並把這個閉包傳遞給該方法。代碼如下:

my_var = “hello”MyClass = Class.new do     puts “#{my_var} in the class definition”     def my_method          #...這裡怎樣列印出來呢?     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
hello in the class definitionhello in the method
使用方法來替代範圍門,可以讓一個範圍看到另一個範圍中的變數,這種技術可以稱之為“扁平範圍”。

共用範圍

將一組方法定義到,某個變數的扁平範圍中,可以保證變數僅被有限的幾個方法所共用。這種方式稱為共用範圍。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.