2010-06-24 59 views

回答

7

挖此:

>> global_variables 
=> ["$-l", "$LOADED_FEATURES", "$?", ... , "$SAFE", "$!"] 
>> method(:global_variables) 
=> #<Method: Object(Kernel)#global_variables> 

對於比較:

>> method(:foo) 
NameError: undefined method `foo' for class `Object' 
    from (irb):6:in `method' 
    from (irb):6 
>> 
+0

工程...雖然我更多地尋找一種方式來說'classof? global_variables => method' – 2010-06-24 19:10:02

+1

你也可以做一些像'defined?(global_variables)'這將返回字符串''方法'''。 – Eimantas 2010-06-25 04:41:41

0

一般全局方法由內核定義,這是對象的祖先。所有在類之外編寫的方法都被視爲Object的私有方法。

irb(main):031:0> Object.private_methods.select{|x| x.to_s.start_with? 'gl'} 
=> [:global_variables] 

irb(main):032:0> f = [1,2,3] 
=> [1, 2, 3] 
irb(main):033:0> f.class 
=> Array 
irb(main):037:0> Object.private_methods.select{|x| x.to_s.start_with? 'f'} 
=> [:format, :fail, :fork] 
0

當Ruby看到一個裸詞時,它總是首先檢查是否存在具有該名稱的局部變量。如果沒有,它會嘗試調用一個方法:

>> def foo 
.. "bar" 
.. end 
=> nil 
>> foo = "lala" 
=> "lala" 
>> foo 
=> "lala" 
>> # to explicitly call the method 
.. foo() 
=> "bar" 

如果它無法解析名稱,可以是局部變量或方法,您會收到以下錯誤:

>> bar 
NameError: undefined local variable or method `bar' for #<Object:0x000001008b8e58> 
    from (irb):1 

由於你以前沒有分配到'global_variables',它必須是一個方法。

相關問題