【问题标题】:Using symbols to access instance variables?使用符号访问实例变量?
【发布时间】:2012-07-16 18:55:29
【问题描述】:

显然,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, &amp;:fn)give(5) {|x| x.fn} 都给了

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

但是&amp;:fn 的真正含义是什么?我知道&符号可以将 Proc 转换为块,例如

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

那么:fn这个符号是什么意思呢?我在哪里可以看到这样的使用文档?我们可以使用符号来访问实例变量,比如person:newperson[:new]

【问题讨论】:

  • person[:new] 将用于访问密钥为符号的哈希
  • @KassymDorsel,谢谢。我知道哈希的情况,但这里它是一个类的对象,'&:fn' 中的符号访问实例变量。
  • 和号实际上会将对象转换为Proc,而:fn只是符号,&amp;:fn相当于&amp;(:fn.to_proc)
  • 您可以像 give(5, &amp;lambda{ |x| x.fn }) 一样将 lambda 传递给您的函数,与号是 Ruby 语法的一部分,用于将 Proc 对象传递给方法(或任何其他具有 to_proc 方法的对象) .
  • @highBandWidth "和'&:fn`中的符号访问实例变量。" 不,不,它调用fn方法。

标签: ruby block symbols proc


【解决方案1】:

简单。声明

attr_accessor :fn

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

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

Ruby“语法”&amp;:fn 是运算符&amp; 尝试转换为proc 的符号。你猜怎么着? Symbol 实现 to_proc。猜猜看是这样的:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2015-12-17
    • 1970-01-01
    • 2013-11-08
    相关资源
    最近更新 更多