2012-05-30 58 views
2
1.9.3-p194 :012 > b=[1,2,3];b.instance_variable_set :@internal, "rrr"; 
b.define_singleton_method :xx do; @internal; end 
=> #<Proc:[email protected](irb):12 (lambda)> 
1.9.3-p194 :013 > b 
=> [1, 2, 3] 
1.9.3-p194 :014 > b.xx 
=> "rrr" 
1.9.3-p194 :015 > b.define_singleton_method :"xx=(val)" do; @internal=val; end 
=> #<Proc:[email protected](irb):15 (lambda)> 
1.9.3-p194 :017 > b.xx="yy" 
NoMethodError: undefined method `xx=' for [1, 2, 3]:Array 
    from (irb):17 
    from /home/sir/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>' 

我想拥有作者的实例变量,但它不起作用。我究竟做错了什么?ruby​​ define_singleton_method:“attr =(val)”不起作用

回答

6

应该通过块接受的参数,通过方法名称并不:

b.define_singleton_method(:xx=) do |val| 
    @internal = val 
end 
1

你定义了一个名为xx=(val)方法,但你调用一个名为xx=方法。您需要更改定义或呼叫站点,以便两者匹配。

+0

是的......我已经看到这个'attr_writer:v'是'def v =(value)的快捷方式; @ V =值;结束'红宝石accessor手册,所以我认为它会工作 –

相关问题