3

すべてが質問に記載されています。これらのメソッドは両方とも、コード名を使用してインスタンス変数にアクセス(読み取り/書き込み)できます。

__send__


instance_variable_set
instance_variable_get

誰かが例でそれを説明できますか?

メタプログラミングは、抽象化して探索するときに脳を溶かしてしまうことがあります。

===編集===

脳が再び溶けている場合に後で使用するための例として、回答の履歴書を作成します。

クラス宣言

class Person

  attr_accessor :first_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    @first_name + ' ' + @last_name
  end

end

初期化

actor = Person.new('Donald', "Duck")
=> #<Person:0xa245554 @first_name="Donald", @last_name="Duck">

送信(読み取り)の使用法:

actor.send('first_name')
=> "Donald"

actor.send(:first_name)
=> "Donald"

actor.send("last_name")
=> "Duck"

actor.send(:last_name)
=> "Duck"

actor.send('full_name')
=> "Donald Duck"

actor.send(:full_name)
=> "Donald Duck"

instance_variable_getの使用法(読み取り)

actor.instance_variable_get('@first_name')
=> "Donald"

actor.instance_variable_get(:@first_name)
=> "Donald"

actor.instance_variable_get('@last_name')
=> "Duck"

actor.instance_variable_get(:@last_name)
=> "Duck"

送信(書き込み)の使用法:

actor.send('first_name=', 'Daisy')

actor.send('full_name')
=> "Daisy Duck"

actor.send(:first_name=, "Fifi")

actor.send("full_name")
=> "Fifi Duck"

instance_variable_setの使用法(書き込み)

actor.instance_variable_set('@first_name', 'Pluto')
actor.send("full_name")
=> "Pluto Duck"

actor.instance_variable_set(:@last_name, 'Dog')
actor.send(:full_name)
=> "Pluto Dog"

instance_variable_getの誤った使用法(読み取り)

actor.instance_variable_get('full_name')
#NameError: `full_name' is not allowed as an instance variable name

actor.instance_variable_get('last_name')
#NameError: `last_name' is not allowed as an instance variable name

RailsActiveRecordとその関連付けに混乱していました。

答えてくれてありがとう!

4

2 に答える 2

2

__send__名前/シンボルでメソッドを呼び出すことができ、インスタンス変数
instance_variable_*を設定/取得できます。

于 2013-01-23T10:58:00.790 に答える
2

__send__メソッドは、クラスで定義されているメソッドを呼び出します。メソッドが定義されていない場合、メソッドを使用することはできませんsendinstance_variable_getsetメソッドは、カプセル化メソッド(getterやsetterなど)を必要とせずにインスタンス変数の値を変更します。

__send__シンボルで識別されるメソッドを呼び出し、必要に応じて引数を渡す場合に使用されます。

例えば

class Test
  def sayHello(*args)
    "Hello " + args.join(' ')
  end
end
k = Test.new
k.send :sayHello, "readers"   #=> "Hello readers"

instance_variable_get指定されたインスタンス変数の値を返します。インスタンス変数が設定されていない場合はnilを返します。カプセル化を必要とせずにこの方法を使用する

例えば

class Test
  def initialize(p1)
    @a = p1
  end
end
test = Test.new('animal')
test.instance_variable_get(:@a)    #=> "animal"

instance_variable_setメソッドをカプセル化する必要なしに、インスタンス変数の値を設定するために使用されます。例えば

class Test
  def initialize(p1)
    @a = p1
  end
end
test = Test.new('animal')
test.instance_variable_set(:@a, 'animal')
于 2013-01-23T11:47:40.573 に答える