使用符号访问实例变量?

时间:2012-07-17 19:30:14

标签: ruby block symbols proc

显然,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是什么意思?我在哪里可以看到这样使用的文档?我们可以使用符号来访问实例变量,例如说person:newperson[:new]吗?

1 个答案:

答案 0 :(得分:4)

简单。声明

attr_accessor :fn

没有定义某种特殊的实例变量。它声明了两种(大约)这种形式的方法:

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

Ruby“syntax”&:fn是运算符&尝试转换为proc的符号。你猜怎么着? Symbol实施to_proc。猜猜看起来像:

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

捕获self,它是符号:fn,在调用时,它告诉obj执行方法fn,它返回实例变量的值。

编辑:回答问题的第二部分,不,是的。用你说的语法,没有。但是,您可以使用BasicObject#__send__的符号调用方法,并且可以对{strong>非attr_accessor 实例变量Object#instance_variable_get执行相同的操作。