程式扎記: [ Ruby Gossip ] Advance : 類別 - 檢視物件

標籤

2014年11月26日 星期三

[ Ruby Gossip ] Advance : 類別 - 檢視物件

Source From Here
Preface
如果想知道實例上有哪些方法可以使用,可以有幾個方法:
methods取得實例上非 private 方法
public_methods取得實例上 public 方法
protected_methods取得實例上 protected 方法
private_methods取得實例上 private 方法

檢視物件
取得的清單預設包括類別上定義的實例方法與物件本身的單例方法,呼叫如果給定一個 false,表示僅取得物件本身的方法,也就是 單例方法。例如:


Object 繼承自 BasicObject,並含括了 Kernel 模組的 private 實例方法(也就是那些頂層方法),沒有自已定義 private 或 protected 實例方法,如果想得知物件上的單例方法,可以使用singleton_methods 方法:
>> o.singleton_methods
=> [:some]

想要快速得知物件上是不是有某些方法,可以在取得清單之後使用 include?,或者是使用 grep 配合規則表示式(Regular expression)。例如:


如果使用 respond_to? 查詢物件是否對某訊息回應,只有 public 方法才會傳回 true,protected 或 private 方法會傳回 false。

對於類別或模組本身定義的實例方法,可以使用以下幾個方法取得清單:
instance_methods可取得類別或模組上定義的非 private 實例方法
public_instance_methods可取得類別或模組上定義的 public 實例方法
protected_instance_methods可取得類別或模組上定義的 protected 實例方法
private_instance_methods可取得類別或模組上定義的 private 實例方法

同樣地,如果呼叫方法時加上 false,表示僅取得類別或模組中定義的實例方法,排除繼承或含括而來的實例方法。例如:


其實 instance_methods 與該類別 new 出來的物件上的 methods 的內行應該是一樣的:


想得知類別或模組本身定義的類別或模組方法,可以使用以下兩個方法取得清單:
public_class_method取得 public 的模組或類別方法
private_class_method取得 private 的模組或類別方法

如果想取得實例化物件的類別,可以使用 class 方法,如果想知道類別的父類別,可以使用 superclass 方法,如果想取得物件的單例類別,可以使用 singleton_class

如果想知道目前的 區域或全域變數清單,可以使用 local_variables 與 global_variables 方法,如果想知道物件的實例變數,可以使用 instance_variables 方法,如果想知道類別或模組變數,可以使用 class_variables 方法。例如:


想得知變數是哪個範圍的變數,可以使用 defined? 方法:
>> x = 10
=> 10
>> X = 10
=> 10
>> defined? x
=> "local-variable"
>> defined? X
=> "constant"
>> defined? xyz
=> nil

如果想取得某個類別的所有實例,可以透過 ObjectSpace。例如:


沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!