0

camp.rb の最初の行の 1 つ: https://github.com/camping/camping/blob/ae5a9fabfbd02ba2361ad8831c15d723d3740b7e/lib/camping-unabridged.rb#L17

meta_defフレームワークはメソッドをObjectクラスに追加します。私はこのコードをいじっていますが、それが何をしているのかまだ理解できません。

class Object #:nodoc:
  def meta_def(m,&b) #:nodoc:
    (class<<self;self end).send(:define_method,m,&b)
  end
end

このように印刷しようとすると(class<<self;self end)

class Object #:nodoc:
  def meta_def(m,&b) #:nodoc:
    puts (class<<self;self end)
  end
end

puts 'a'.meta_def 'boo'

を出力します。#<Class:#<String:0x146810>>これは、 のインスタンスを作成していることを意味しますClass。しかし、それが何であり、何をしたのかはまだわかりません(class<<self;self end)。誰かがこれがどのように機能するか説明できますか?

4

1 に答える 1

1
class Object 
  def meta_def(m,&b) 
    (class<<self;self end)
  end
end
ob = 'a'
ob.meta_def 'boo' # => #<Class:#<String:0x94daf54>>
ob.singleton_class # => #<Class:#<String:0x94daf54>

それが正確に何であり、何をしたのかはまだわかりません(class<<self;self end)

あなたのコードは、メソッドsingleton_classの receiver( ) を作成しています。以下を見てください:'a'meta_def

class Object #:nodoc:
  def meta_def(m,&b) #:nodoc:
    (class<<self;self end).send(:define_method,m,&b)
  end
end
ob = 'foo'
ob.meta_def(:meth) {"Welcome"}
ob.meth # => "Welcome"

上記のコードで、行は何をしているのでしょうか?

上記のように、最初にレシーバーのシングルトン クラスを作成します。次に、 を使用して、レシーバーのシングルトン クラス用に1 行のみを含むボディで名前がdefine_method付けられたメソッドを作成します。:meth"Hello"

于 2013-09-14T04:21:57.470 に答える