eval的使用

irb(main):026:0> class << Object
irb(main):027:1> def attr_init1(name,klass)
irb(main):028:2> define_method(name){puts 'haha';eval "@#{name} ||= #{klass}.new"}
irb(main):029:2> end
irb(main):030:1> end
=> nil
irb(main):031:0> Object.attr_init1("k1",Klass)
=> #<Proc:0xb7d328b0@(irb):28>
irb(main):032:0> Object.k1
haha
=> #<Klass:0xb7d41d88>

==================================
irb(main):038:0> class << Object
            def attr_init2(name, klass)
              eval "puts 'hahaha';define_method(name) { @#{name} ||= #{klass}.new } "
            end
           end
=> nil
irb(main):043:0> Object.attr_init2("k2",Klass)
hahaha
=> #<Proc:0xb7d5f6a8@(eval):1>
class << Object
 def attr_init2(name, klass)
  eval "define_method(name) { puts 's';@#{name} ||= #{klass}.new } "
 end
end
irb(main):050:0> Object.attr_init2("k2",Klass)
=> #<Proc:0xb7d48908@(eval):1>


这样看来我的说法就是正确的,第一段代码,在定义期间,不会执行define_method块的代码,所以不会执行eval,第二段代码,却是执行了eval,在方法调用的时候,第一段代码会执行eval,第二段代码不会执行eval,还是那个原因(对于已经执行过的代码解释器会有记录而不会重新解释)。
具体Ruby解释器的工作原理大致就是这样了。。。再深入的内容还需要找资料
我明白那句话的意思了,是我刚开始的理解有偏差,呵呵,感谢blackanger啊,这么有耐心,大家都像你这样回帖,何愁论坛不发扬光大呢?
我说的可能没有说详细,第一段代码执行eval的效率之所以比第二段eval执行的效率高是因为第二段比第一段多了个define_method过程,再深入就不清楚了。。。呵呵
不用谢,以后你多搞出这样的问题来,也挺有意思
Ruby程序执行过程,原来在参考手册就有。。。
http://www.infowe.com/ruby/lanstyle_run.html#