2

Ruby をよりよく理解するために、attr_accessor メソッドを再作成することにしました。成功しました。Ruby のシンタックス シュガーに関する 1 つの詳細を除いて、これがどのように機能するかを理解できました。作成した attr_accessor メソッドは次のとおりです。

def attr_accessor(*attributes)
  attributes.each do |a|
    # Create a setter method (obj.name=)
    setter = Proc.new do |val|
      instance_variable_set("@#{a}", val)
    end

    # Create a getter method (obj.name)
    getter = Proc.new do
      instance_variable_get("@#{a}")
    end

    self.class.send(:define_method, "#{a}=", setter)
    self.class.send(:define_method, "#{a}", getter)
  end
end

私の見方では、obj.nameゲッターとobj.name=セッターの 2 つのメソッドを定義しただけです。しかし、IRB でコードを実行して呼び出すobj.name = "A string"と、スペースなしでメソッドを定義しても機能します。

これが Ruby を定義する魔法の一部にすぎないことはわかっていますが、これが機能する正確な理由は何でしょうか?

4

2 に答える 2

2

ruby インタープリターがを検出するとobj.name = "A string、 と の間のスペースを無視して、 で名前が付けられたメソッドを探します。name=name=obj

于 2013-02-14T14:47:01.490 に答える
-1

気にしないでください。「文字列」は完全に適切なメッセージ名です。試してみてください

obj.send "A string" # ^_^

数字を使用することもできます:

o = Object.new
o.define_singleton_method "555" do "kokot" end
o.send "555"
于 2013-02-14T14:45:37.237 に答える