我正在閱讀一本Ruby書籍,它看起來像一個方法或類定義是一個對象。 所以,我可以這樣做:類或方法定義也是Ruby中的一個對象嗎?
my_class = class Abc; end
my_class評估爲NilClass。
你可以用這個變量做的事情不多。但是,將類或方法定義爲nil
對象又有什麼意義呢?
我正在閱讀一本Ruby書籍,它看起來像一個方法或類定義是一個對象。 所以,我可以這樣做:類或方法定義也是Ruby中的一個對象嗎?
my_class = class Abc; end
my_class評估爲NilClass。
你可以用這個變量做的事情不多。但是,將類或方法定義爲nil
對象又有什麼意義呢?
通常變量不會被分配給類或方法定義。
然而,這是可能的匿名類:
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"
雖然說實話,這種解構的是不是從一個可理解的角度一定有利,除非有一些元編程回事它可能是簡單的使用方法,定期/班。
我傾向於認爲作者意味着您可以將類和方法分配給變量(而不是定義它們的文字語句)。
當您定義一個類時,您定義它的代碼塊將返回最後一條評估語句。例如,您的示例返回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
沒有,類定義和方法定義是語法,它們不是對象。他們做,但是評估一個對象:
方法定義計算爲Symbol
表示該方法的名稱:
def foo; end
#=> :foo
這允許你做這樣的事情,例如:
private def foo; end
類定義評估爲在定義內部求值的最後一個表達式的值:
class Foo; 'Hello' end
#=> 'Hello'