rails环境下 ruby环境下class_eval的区别

rails环境下 ruby环境下class_eval的区别

先入为主,先看两段代码

1、写一段纯ruby脚本pure_ruby.rb:

module Big
  def middle(tiny)
    class_eval <<-RUBY_EVAL
      def #{tiny}
        "#{tiny}"
      end
    RUBY_EVAL
  end
end

class Size
  include Big

  def little
    middle("tiny")
  end
end

p Size.new.little       #=>class_eval undefine
p Size.instance_methods #=>[:little, :middle, ...]
p Big.instance_methods  #=>[:middle]

2、在rails环境下,比如/lib/rails_ruby.rake

desc 'the environment of ruby on rails'
task :rails_ruby, :enviroment => do
  module Big
    def middle(tiny)
      class_eval <<-RUBY_EVAL
        def #{tiny}
          "#{tiny}"
        end
      RUBY_EVAL
    end
  end

  class Size
    include Big

    def little
      middle("tiny")
    end
  end
end
p Size.new.little       #=>:little
p Size.instance_methods #=>[:little, :middle, :tiny, ...]
p Big.instance_methods  #=>[:middle, :tiny]

很显然,从Size.new.little的结果可以看出,include Big后,传到middleclass_evalself不是Size而是Size实例,而调用class_eval一定是Class或是Module,在rails环境下实例可以调用class_eval,这明显是rails框架的问题,通过pry的跟踪rails源码,原来是rails的activesupportKernelcalss_eval的重新定义,rails下calss_eval的源码

转载于:https://www.cnblogs.com/chenzhenzhen/p/6474603.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值