显然,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:new
或person[:new]
吗?
答案 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
执行相同的操作。