4

どうやら、Rubyはシンボル付きのインスタンス変数の値を返すコードブロックを作成できます。検討:

class Person
    attr_accessor :fn
end

def give(n,&b)
    i=0
    while(i<n)
       aa = Person.new
       aa.fn = "name #{i}"
       i=i+1
       puts b.call(aa)
    end
end

今、両方give(5, &:fn)give(5) {|x| x.fn}与える

name 0
name 1
name 2
name 3
name 4
=> nil

しかし、&:fn実際にはどういう意味ですか?アンパサンドがProcを次のようなブロックに変換できることを知っています

bb = Proc.new {|x| x.fn}
give(5, &bb)

では、記号:fnはどういう意味ですか?このような使用法のドキュメントはどこで確認できますか?シンボルを使用して、sayやなどのインスタンス変数にアクセスできますperson:newperson[:new]

4

1 に答える 1

4

単純。声明

attr_accessor :fn

ある種の特別なインスタンス変数のものを定義しません。これは、(おおよそ)この形式の2つのメソッドを宣言します。

def fn
  @fn
end
def fn=(v)
  @fn=v
end

Rubyの「構文」&:fnは、オペレーター&がprocに変換しようとするシンボルです。そして、何を推測しますか?Symbolを実装しto_procます。それは次のように見えると思います:

def to_proc
  Proc.new {|obj| obj.__send__(self)}
end

これは、をキャプチャします。これは、呼び出し時に、インスタンス変数の値を返すメソッドを実行するように指示するselfシンボルです。:fnobjfn

編集:質問の2番目の部分、いいえとはいに答えます。あなたが言う構文では、いいえ。ただし、を使用してシンボルからメソッドを呼び出すことができ、を使用してインスタンス変数ではないBasicObject#__send__場合にも同じことを行うことができます。attr_accessorObject#instance_variable_get

于 2012-07-17T20:01:34.193 に答える