`
hanqingwxf2008
  • 浏览: 51287 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

rails之 最有用的eval族方法:class_eval

    博客分类:
  • ruby
 
阅读更多

从本质上讲,class_eval(也就是module_eval)可进入类定义体中:

1 c=Class.new
2 c.class_eval do
3    def some_method
4        puts "created in class_eval"
5    end
6 end
7 C.new.some_method   => "created in class_eval"
8 
但是,可以用class_eval做某些class关键字不能做的事: 

1.在类定义的上下文中对字符串求值。
2.为匿名类(不包含单例类)打开类定义。
3.获取外围作用域中变量的访问权。
特别是第3个值得注意,如下代码:

1 var = "init var"
2 class C
3 puts var
4 end    => NameError:undefined local variable or method 'var' for C:Class..
5 
6 C.class_eval {puts var}
7        => init var
8 

变量var在标准的类定义体的作用域之外,但是传递给class_eval的代码块的作用域之内。

当在class_eval的块中定义一个实例方法时,又有所不同:

1 C.class_eval{ def talk; puts var; end }
2 
3 C.new.talk  => undefined loc.'var'..
4 

和任何def一样,在代码块中的def打开了一个新的作用域-所以变量var成为不可访问的。

如果就是想要把外部作用域的变量硬塞到实例方法中,可以使用另外一个技术来生成方法:define_method方法。

为了在实例方法中访问变量var,可以这么做:

1 C.class_eval { define_method("talk"){puts var}}
2 C.new.talk
3     => init 
这样的技术员不会像标准的类和方法定义那样经常地使用,但是在看到它们的时候,就知道它们暗示着一个扁平化的局部变量作用域。而不是像更通用的class和def那样打开新的作用域。
define_method是Module类的实例方法,所以Module或Class的任意实例都可以调用该方法。如果想要在实例方法中访问常规的类定义体中(在此上下文中self是类对象)的局部变量,那么可以在一个通常的类定义体中使用define_method。

分享到:
评论

相关推荐

    脚本编程之: ruby_bcyy_jb51.net

    6. **元编程**:Ruby的元编程特性,如`class_eval`、`instance_eval`、`method_missing`等,以及如何利用它们来增强代码的动态性。 7. **测试驱动开发(TDD)**:Ruby社区非常注重TDD,因此可能包含关于Rspec或Test::...

    转载 - 26本 Ruby/Rails 相关英文图书简评

    理解元编程的概念,如 `class_eval`、`instance_eval`、`define_method` 等,对于编写灵活的代码至关重要。 3. **Ruby on Rails 框架**:Rails 的核心概念包括 MVC(模型-视图-控制器)架构、路由、数据库交互...

    scheherazade:Rails 的娱乐装置

    穿得不多(最小的 DSL,没有instance_eval ) 简单示例 # Say we have a model like: class Department belongs_to :company has_many :employees validates_presence_of :company, :name end # Without any ...

    ruby metaprograming

    instance.singleton_class.class_eval do def unique_method puts "This is a unique method." end end instance.unique_method # 输出: "This is a unique method." ``` ##### 2. 开放类(Open Classes) 在...

    notes_about_rails:我关于Rails源代码的注释-ab source code

    Rails大量利用了这一特性,通过模块混入(mixins)、方法定义(define_method)和类扩展(class_eval)等技术来实现其灵活的架构。 2. **ActiveRecord**:这是Rails的ORM(对象关系映射)组件,它将数据库操作转换...

    ruby中文教程(源代码)

    - `eval`和`instance_eval`:`eval`可以执行字符串中的Ruby代码,`instance_eval`允许在特定对象的上下文中执行代码。 - `module_function`和`extend`:这两个方法可以让你在模块中定义的方法在类或对象上直接调用...

    Ruby语言中文教程.rar

    - `class_eval`和`instance_eval`:用于在类或对象上下文中执行代码。 5. **Gem包管理系统** - Ruby的生态系统中,Gem是代码库的分发方式。开发者可以使用`gem install`命令安装所需的库,如Rails框架。 - ...

    ruby设计模式的代码有好多

    Ruby的元编程能力,如`class_eval`、`instance_eval`和`define_method`等方法,使得动态修改类和对象的行为变得容易,这在实现某些设计模式时特别有用。例如,元编程可以用来在运行时添加方法,实现动态代理或者创建...

    Ruby中文参考手册

    11. **类和对象初始化**:Ruby中通过initialize方法初始化对象,而Class.new可以用来创建新的类。 12. **Ruby on Rails**:尽管手册可能主要关注语言本身,但也会涉及Rails框架的基本概念,如MVC架构、路由、数据库...

    元编程 Ruby

    1. 动态方法定义:Ruby允许在运行时定义新的方法,这包括使用define_method、class_eval等方法。 2. 方法拦截:Ruby提供了method_missing方法,它允许我们拦截对当前对象中未定义方法的调用,并进行自定义处理。 3...

    一些高质量的学习Ruby的资源清单.zip

    了解 `class_eval`、`instance_eval`、`define_method` 等方法可以帮助你更深入地掌握这一特性。 6. **测试驱动开发(TDD)**:Ruby 社区强调 TDD,因此熟悉 RSpec 或 MiniTest 这样的测试框架是必要的。学会编写...

    Ruby学习思维导图.pdf

    - **Object#class_eval**:在类的上下文中执行代码。 - **Object#instance_eval**:在对象的上下文中执行代码。 #### 五、Ruby on Rails **5.1 MVC 架构** - **模型**:代表应用程序中的数据和业务规则。 - **...

    ruby书籍2

    书中可能会介绍`class_eval`、`define_method`等动态创建方法的技术,以及符号到方法的转换(`to_proc`)等高级特性。 4. **Ruby与Rails的集成**:Rails是基于Ruby的Web开发框架,书中可能会详细探讨Ruby如何与...

    在快速学习一门语言RUBY推荐

    - `send`方法可以动态调用对象的方法,`class_eval`和`instance_eval`可以在运行时向类或对象添加代码。 8. **错误处理**: - 使用`begin..rescue..end`结构处理异常,可以捕获并处理程序运行时可能出现的错误。 ...

    ruby_1_9_3_core_rdocs.gz

    8. **元编程**:Ruby的元编程能力是其一大特色,通过`class_eval`、`instance_eval`和`define_method`等方法,可以在运行时动态修改类和对象的行为。 9. **线程与并发**:Ruby 1.9.3引入了全局解释器锁(GIL),...

    Ruby中文文档.rar

    - `class_eval`和`instance_eval`:允许在运行时修改类或对象的定义。 - `define_method`和`method_missing`:前者用于在运行时定义方法,后者是当尝试调用一个不存在的方法时的回调,常用于实现自定义错误处理或...

    mac snow leopard安装ruby

    在 Mac OS X Snow Leopard(版本 10.6)系统下安装 Ruby 和进行 Ruby on Rails 的开发,是许多开发者特别是初学者可能会遇到的需求之一。尽管 Snow Leopard 已经是一个相对较老的操作系统版本,但仍然有不少用户由于...

    Ruby程序设计

    `class_eval`和`instance_eval`方法可以在运行时添加方法,`method_missing`方法可以捕获未定义的方法调用。 了解并熟练掌握以上知识点是成为Ruby程序员的基础。Ruby的灵活性和强大功能使其在很多领域都有应用,如...

    ruby(前途大好的ruby+rains)

    3. **元编程**:Ruby的元编程能力非常强大,可以使用`class_eval`、`instance_eval`等方法在运行时修改或创建类和对象的行为。 4. **块和 Proc**:Ruby中的块是一段可执行的代码,可以与方法一起使用,通过`do..end...

    ruby使用文档

    - `class_eval`、`instance_eval`、`define_method`等方法可用于动态定义或修改类和方法。 8. **块与 Proc**: - 块是Ruby中的匿名函数,使用`do..end`或花括号`{}`定义。 - `Proc`对象可以存储块,与`lambda`...

Global site tag (gtag.js) - Google Analytics