Source From Here
Preface
先前談過,在 Ruby 中有五種變數,包括區域變數、全域變數、實例變數、類別變數與常數,先前曾討論過一些範圍(Scope)的問題,在學到模組之後,這邊要正名為區域變數、全域變數、實例變數、類別模組變數 與 常數。以下對變數作個總整理。
再看變數範圍
以 $$ 開頭的全域變數是最容易理解的,因為整個程式中隨處可見。以小寫字母開頭的區域變數的範圍也許是其次容易理解的,在 Ruby 中,非常明確的,區域變數就真的只是區域變數,無論它出現在哪個區域,可見範圍就僅止於該區域,不會跨入內嵌的子區域。如果出現在類別區域,就是在類別區域中可見,不會在方法區域中可見。如果出現在模組區域中,就只在模組區域中可見,不會在類別或方法中可見。例如:
如果類別或模組中定義了常數,則類別或模組,或其中的方法都可取用常數(方法中不能設定常數)。常數若定義在類別中,則可以透過「類別名稱::常數」的方式取得。常數若定義在模組中,則可以透過「模組名稱::常數」的方式取得。事實上,類別名稱或模組都必須以大寫名稱作開頭,而大寫名稱在 Ruby 中是定義為常數,所以類別名稱與模組名稱,其實就是個常數。例如:
因此,模組也常被用來作為類別、公用方法或公用常數的名稱空間,而與特定類別相關的公用常數與公用方法則定義在特定類別中。如果類別或模組外定義了常數,則類別或模組內可以直接取用常數,在類別或模組中若設定了同名常數,則是會使用類別或模組中自己定義的常數。例如:
關於 @@ 開頭的變數,在 類別變數 中作過深入的討論,實際上,@@ 開頭的變數,也可以定義在模組中,姑且稱之為模組變數,屬於模組擁有,模組變數必須定義模組方法來取得。例如:
實際上,@@ 開頭的變數,範圍貫穿模組或類別以及當中定義的方法(無論是實例方法或是類別方法),而且在 Object 類別中,若有 @@ 變數與內部類別的@@類別變數同名,則外部類別的 @@ 變數會覆蓋內部類別的 @@ 變數(在 Object 中定義 @@ 變數,幾乎就等同全域變數了)。因此要小心使用,你可以回顧 類別變數 中看過的幾個例子。
以 @ 開頭的變數為實例變數,屬於個別物件擁有,可視範圍僅限於物件之內,要取得實例變數,必須為該物件定義實例方法。@ 開頭的變數,並不是只能出現在實例方法中,如果 @ 開頭的變數出現在類別或模組本體,那它就是屬於類別或模組(因為它們也是物件),出現在類別或模組方法中時,表示要存取的就是該類別或模組擁有的實例變數。例如:
出現在 Some 本體的 @a,是屬於 Some 類別擁有的實例變數,因此必須透過類別方法 Some.a 取得。出現在實例方法中的 @a,則屬於 Some 產生的 s 實例擁有,因此必須透過 s.a 實例方法存取。那麼,@@ 開頭的變數與 @ 開頭的變數有何不同?來看看這個例子:
這是在 類別變數 討論過的情況,直譯器看到 @@a 時,會往外看類別或模組邊界在哪(而不是看到 Some.a 中的 Some),結果看到的邊界是 Object,但 Object 中並沒有定義 @@a,因此發生錯誤。如果是以下呢?
直譯器看到 @a 時,會看看是透過哪個實例呼叫,結果是 Some,因此取得的是 Some 中定義的 @a。
@ 開頭的變數一定是在實例上,只是這個實例可能是類別、模組或依類別建構出來的實例;@@ 開頭的變數,可記憶為比 @ 擁有更大可視範圍的意涵,其範圍貫穿模組或類別以及當中定義的方法(無論是實例方法或是類別方法),並需留意 Object 中 @@ 變數幾乎等同全域變數的情況。
This is a blog to track what I had learned and share knowledge with all who can take advantage of them
標籤
- [ 英文學習 ]
- [ 計算機概論 ]
- [ 深入雲計算 ]
- [ 雜七雜八 ]
- [ Algorithm in Java ]
- [ Data Structures with Java ]
- [ IR Class ]
- [ Java 文章收集 ]
- [ Java 代碼範本 ]
- [ Java 套件 ]
- [ JVM 應用 ]
- [ LFD Note ]
- [ MangoDB ]
- [ Math CC ]
- [ MongoDB ]
- [ MySQL 小學堂 ]
- [ Python 考題 ]
- [ Python 常見問題 ]
- [ Python 範例代碼 ]
- [心得扎記]
- [網路教學]
- [C 常見考題]
- [C 範例代碼]
- [C/C++ 範例代碼]
- [Intro Alg]
- [Java 代碼範本]
- [Java 套件]
- [Linux 小技巧]
- [Linux 小學堂]
- [Linux 命令]
- [ML In Action]
- [ML]
- [MLP]
- [Postgres]
- [Python 學習筆記]
- [Quick Python]
- [Software Engineering]
- [The python tutorial]
- 工具收集
- 設計模式
- 資料結構
- ActiveMQ In Action
- AI
- Algorithm
- Android
- Ansible
- AWS
- Big Data 研究
- C/C++
- C++
- CCDH
- CI/CD
- Coursera
- Database
- DB
- Design Pattern
- Device Driver Programming
- Docker
- Docker 工具
- Docker Practice
- Eclipse
- English Writing
- ExtJS 3.x
- FP
- Fraud Prevention
- FreeBSD
- GCC
- Git
- Git Pro
- GNU
- Golang
- Gradle
- Groovy
- Hadoop
- Hadoop. Hadoop Ecosystem
- Java
- Java Framework
- Java UI
- JavaIDE
- JavaScript
- Jenkins
- JFreeChart
- Kaggle
- Kali/Metasploit
- Keras
- KVM
- Learn Spark
- LeetCode
- Linux
- Lucene
- Math
- ML
- ML Udemy
- Mockito
- MPI
- Nachos
- Network
- NLP
- node js
- OO
- OpenCL
- OpenMP
- OSC
- OSGi
- Pandas
- Perl
- PostgreSQL
- Py DS
- Python
- Python 自製工具
- Python Std Library
- Python tools
- QEMU
- R
- Real Python
- RIA
- RTC
- Ruby
- Ruby Packages
- Scala
- ScalaIA
- SQLAlchemy
- TensorFlow
- Tools
- UML
- Unix
- Verilog
- Vmware
- Windows 技巧
- wxPython
訂閱:
張貼留言 (Atom)
[Git 常見問題] error: The following untracked working tree files would be overwritten by merge
Source From Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 # git clean -d -fx 方案2: 今天在服务器上 gi...
-
前言 : 為什麼程序管理這麼重要呢?這是因為: * 首先,本章一開始就談到的,我們在操作系統時的各項工作其實都是經過某個 PID 來達成的 (包括你的 bash 環境), 因此,能不能進行某項工作,就與該程序的權限有關了。 * 再來,如果您的 Linux 系統是個...
-
屬性 : 系統相關 - 檔案與目錄 語法 : du [參數] [檔案] 參數 | 功能 -a | 顯示目錄中個別檔案的大小 -b | 以bytes為單位顯示 -c | 顯示個別檔案大小與總和 -D | 顯示符號鏈結的來源檔大小 -h | Hum...
-
來源自 這裡 說明 : split 是 Perl 中非常有用的函式之一,它可以將一個字串分割並將之置於陣列中。若無特別的指定,該函式亦使用 RE 與 $_ 變數 語法 : * split /PATTERN/,EXPR,LIMIT * split /...
沒有留言:
張貼留言