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

4

1 回答 1

4

简单的。声明

attr_accessor :fn

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

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,这是符号:fn,在调用时,它告诉obj执行方法fn,该方法返回实例变量的值。

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

于 2012-07-17T20:01:34.193 回答