2017-04-04 36 views
2

我正在閱讀一本Ruby書籍,它看起來像一個方法或類定義是一個對象。 所以,我可以這樣做:類或方法定義也是Ruby中的一個對象嗎?

my_class = class Abc; end 

my_class評估爲NilClass。

你可以用這個變量做的事情不多。但是,將類或方法定義爲nil對象又有什麼意義呢?

回答

0

通常變量不會被分配給類或方法定義。

然而,這是可能的匿名類:

MyClass = Class.new do 
    # class body goes here 
end 

方法定義返回方法名的符號,它可以被用來調用該方法以各種方式

foo_symbol = def foo; "ok"; end 
puts foo_symbol == :foo # => true 

# call the method using send 
send(foo_symbol) # => "ok" 

# convert to a proc and call 
method(foo_symbol).call # => "ok" 

當然該方法仍可通過foo調用。如果目標是創建一個剛分配給變量的匿名方法,那麼最好先將其設置爲一個proc。

foo_proc = Proc.new { "ok" } 
# it can be assigned as an instance method on the class 
MyClass.send(:define_method, :foo, &foo_proc) 
MyClass.new.foo # => "ok" 

雖然說實話,這種解構的是不是從一個可理解的角度一定有利,除非有一些元編程回事它可能是簡單的使用方法,定期/班。

0

我傾向於認爲作者意味着您可以將類和方法分配給變量(而不是定義它們的文字語句)。

當您定義一個類時,您定義它的代碼塊將返回最後一條評估語句。例如,您的示例返回nil,因爲沒有任何評估。但看看會發生什麼,當我們的類定義添加代碼:

irb(main):026:0> class Abc 
irb(main):027:1> SOME_CONSTANT = 'boiled_frogs' 
irb(main):028:1> end 
=> "boiled_frogs" 

如果你想將類分配給一個變量,你會定義類第一:

irb(main):040:0> class Abc ; end 
=> nil 
irb(main):041:0> the_class = Abc 
=> Abc 

方法的工作有點不同的 - 方法返回(當然,代表法名稱的符號)當您最初定義它:

irb(main):037:0> def my_method 
irb(main):038:1> return 'boiled_frogs' 
irb(main):039:1> end 
=> :my_method 
3

沒有,類定義和方法定義是語法,它們不是對象。他們,但是評估一個對象:

方法定義計算爲Symbol表示該方法的名稱:

def foo; end 
#=> :foo 

這允許你做這樣的事情,例如:

private def foo; end 

類定義評估爲在定義內部求值的最後一個表達式的值:

class Foo; 'Hello' end 
#=> 'Hello' 
相關問題