rails环境下 ruby环境下class_eval的区别
2017-02-27 15:53
651 查看
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后,传到middle下class_eval的self不是Size而是Size实例,而调用class_eval一定是Class或是Module,在rails环境下实例可以调用class_eval,这明显是rails框架的问题,通过pry的跟踪rails源码,原来是rails的activesupport下Kernel对calss_eval的重新定义,rails下calss_eval的源码
相关文章推荐
- ruby的class << self, 及其class_eval和instance_eval的区别
- ruby的class << self, 及其class_eval和instance_eval的区别
- ruby的class << self, 及其class_eval和instance_eval的区别
- Ruby1.8.7+Rails2.2环境搭建
- 受限环境下的Ruby On Rails程序优化
- Ruby on rails开发从头来(windows)(一)-使用InstantRails快速搭建Ruby On Rails开发环境
- windows下搭建 Ruby on Rails 开发环境
- 搭建Ruby on Rails开发环境
- 一个 Ruby Rails 程序员在 Linux 下的工作环境[zt]
- Ruby on Rails 发送邮件环境设置
- Ubuntu 8.04 环境下Ruby on Rails 环境简单配置
- Ruby on Rails的下载及安装以及开发环境的搭建
- Windows下ruby on rails环境搭建
- Ruby on Rails 开发环境
- Ruby on Rails 学习笔记之二 - 环境的搭建
- 搭建Ruby on Rails开发环境(http://dev.yesky.com/327/2600827.shtml)
- MagicLinux2.0下配置Ruby on Rails开发环境
- Windows下ruby on rails环境搭建
- 手动配置Ruby On Rails开发环境
- Alex学Ruby[ class_eval(module_eval)现形记]