2017-04-04 10 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' 
関連する問題