私は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'