2011-06-08 110 views
4

我在理解符号如何在我的代码中工作时有点麻烦。我明白它们基本上是不可变的字符串,但我不完全理解符号如何自动“识别”我的代码的其他部分。红宝石 - 了解符号

例如,在下面的程序中,我将两个方法对象传递给我的math_machine方法,但为此,我使用表示其名称的符号。 Ruby如何知道我指的是这些方法?

def plus x,y 
    return x+y 
end 

def minus x,y 
    return x-y 
end 

def math_machine(code,x,y) 
    code.call(x,y) 
end 

puts math_machine(method(:plus),5,5) 
puts math_machine(method(:minus),5,5) 

我不明白的是关于封装符号的另一个例子 - 如何attr_readerattr_writer,并attr_accessor知道后面的符号是指一个实例变量在我的计划?

如果有人能够向我解释Ruby中符号的神秘性质(幕后发生了什么),那真是太棒了!

+2

你已经阅读[这个问题](http://stackoverflow.com/questions/2341837/understanding-symbols-in-ruby)? – 2011-06-08 21:35:56

回答

1

例如,在下面的程序,我 传递两个方法的对象我 math_machine方法,但这样做我 使用代表他们的名字的象征。 Ruby如何知道我指的是 这些方法?

这与符号无关。你甚至可以做method('plus'),你会得到与方法(:plus)相同的结果。

irb(main):001:0> def plus 
irb(main):002:1> end 
=> nil 
irb(main):003:0> method(:plus) 
=> #<Method: Object#plus> 
irb(main):004:0> method('plus') 
=> #<Method: Object#plus> 
irb(main):005:0> method('plus') == method(:plus) 
=> true 

符号,我不明白 是关于封装 的另一个例子 - 怎么办attr_reader,attr_writer,和attr_accessor知道后面的符号 是指一个实例变量 在我的计划?

这些方法旨在为读者,作者和访问者(r + w)提供实例方法。他们只是采用通过符号的值,并创建相关的方法。