您的位置:首页 > 编程语言 > Ruby

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的源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: