http://blackanger.blog.51cto.com/140924/84057/
class_eval和module_eval方法一样, 都是为一个class增加method的。 可以接string和block为参数。 此方法是Ruby的动态特性之一。
class Thing
end
a = %q{def hello() "Hello there!" end}
Thing.module_eval(a)
puts Thing.new.hello()
=> Hello there!
我真没想到Matz还到ruby-forum里去混, 姑且认为是Matz本人吧,他给出的答案是:
用#{y}是在compile time 的时候已经把y的值传给了class_eval.
在运行时, puts “#{y}” 已经变成了 puts “another hi”
而变量y,则因为作用域的不同,外部定义的局部变量y是class_eval无法收到的。
这有个有意思的例子更加说明了这一点:
class T
def first
"hello"
end
def second
"chunky bacon"
end
end
y = "first"
T.class_eval <<-END
def hello
puts #{y}
end
END
T.new.hello
=>prints "hello"
关键点是, #{y}是作为string的一部分传给了class_eval. 此时已经是puts first了。 而不是在call hello方法的时候去找y
本文出自 “{ :Alex Space => &..” 博客,请务必保留此出处http://blackanger.blog.51cto.com/140924/84057
分享到:
相关推荐
在这个例子中,`extend_class`函数接收一个类`klass`作为参数,并通过`class_eval`方法向这个类添加了一个新的实例方法`say_hello`。这样,我们就可以在任何使用了`UtilityModule`的类中为它们动态添加功能。 此外...
通过`eval`, `send`, `instance_eval`, `class_eval`, 动态方法定义,以及`Proc`和`Lambda`等工具,开发者能够创建出更具适应性和可扩展性的代码。在实际项目中,合理利用元编程可以提高代码的效率和可维护性,但...
`class_eval`和`module_eval`允许在类或模块上下文中执行字符串或块作为代码。 3. **对象的反射**:`Object#methods`、`Class#methods`等方法返回对象或类可调用的方法列表。`instance_variable_get`和`instance_...
实施Module#uninclude和Object#unextend 经过测试的Ruby版本 2.2.3 2.2.0 2.1.4 2.1.0 2.0.0 1.9.3 1.9.2 1.8.7 稀土 见 安装 将此行添加到您的应用程序的Gemfile中: gem 'uninclude' 然后执行: $ ...
例如,可以使用 `class_eval` 方法来动态地向类中添加新方法或修改现有方法。 #### 代码示例 ```ruby class Example def show "Original method" end end Example.class_eval do def show "Modified method" ...
例如,读者将学习到如何使用 `class_eval` 和 `instance_eval` 动态定义类和方法,以及 `send` 方法的用法。 此外,本书还会涵盖Ruby的错误处理和异常处理机制,以及测试驱动开发(TDD)和集成测试的相关知识,帮助...
Ruby的元编程能力,如`class_eval`、`instance_eval`和`define_method`等方法,使得动态修改类和对象的行为变得容易,这在实现某些设计模式时特别有用。例如,元编程可以用来在运行时添加方法,实现动态代理或者创建...
`eval`函数可以执行字符串作为Ruby代码,`send`方法可以动态调用对象的方法,而`instance_eval`和`class_eval`则可以在特定上下文中执行代码,极大地增加了代码的灵活性。 在Ruby 2.5.1中,标准库也得到了增强,...
`class_eval`和`instance_eval`等方法是实现元编程的关键。 - **块和 Proc**:Ruby的块(代码块)是通过`do..end`或花括号`{}`包裹的代码片段,可以传递给方法。Proc对象可以捕获和存储一个代码块,使得它可以被多...
文档会讲解如何使用`send`方法动态调用方法,`class_eval`和`instance_eval`等方法改变类结构,以及定义方法的动态方式(如`define_method`)。 5. **异常处理**:Ruby中的异常处理使用`begin/rescue/ensure/end`...
`class_eval`和`instance_eval`方法可以在运行时添加方法,`method_missing`方法可以捕获未定义的方法调用。 了解并熟练掌握以上知识点是成为Ruby程序员的基础。Ruby的灵活性和强大功能使其在很多领域都有应用,如...
例如,你可以使用`define_method`动态定义方法,或者使用`class_eval`或`instance_eval`来执行字符串中的代码,这在编写灵活的框架或库时非常有用。 此外,Ruby的标准库非常丰富,提供了大量实用的模块和函数。例如...
Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`instance_eval`允许在运行时修改类或对象的行为。此外,Ruby的`send`方法可以动态调用方法,`method_missing`可以捕获未定义...
1. 动态方法定义:Ruby允许在运行时定义新的方法,这包括使用define_method、class_eval等方法。 2. 方法拦截:Ruby提供了method_missing方法,它允许我们拦截对当前对象中未定义方法的调用,并进行自定义处理。 3...
例如,`class_eval` 和 `instance_eval` 方法允许在运行时添加或修改类和实例的方法。 7. **Gem 包管理**:虽然在 1.8.6 时代,RubyGems 已经存在,但当时包管理和依赖关系解决不如现在的版本那么成熟。安装和管理...
- `module_function`和`extend`:这两个方法可以让你在模块中定义的方法在类或对象上直接调用。 5. **源代码实践** 本教程的源代码涵盖了以上概念,你可以通过阅读和运行代码来更好地理解Ruby的语法和特性。例如...
- `send` 方法可以调用对象的任何方法,`class_eval` 和 `instance_eval` 可以在运行时定义或修改类和实例的行为。 6. **Gem和Rails框架** - Gem是Ruby的包管理系统,用于安装和管理第三方库。 - Rails是基于...
- `class_eval`和`instance_eval`:允许在运行时修改类或对象的定义。 - `define_method`和`method_missing`:前者用于在运行时定义方法,后者是当尝试调用一个不存在的方法时的回调,常用于实现自定义错误处理或...
`class_eval`和`module_eval`方法可以让你在运行时向类或模块添加代码,`define_method`可以动态定义方法。 5. **Gem生态系统**:Ruby拥有丰富的第三方库,被称为Gems。这些Gems涵盖了各种用途,如Web开发(如Rails...
- **灵活性**:Ruby提供了丰富的API来支持元编程,如`eval`, `instance_eval`, `class_eval`等方法,使得在程序运行过程中动态地创建和修改代码成为可能。 - **简洁性**:Ruby的语法设计鼓励简洁明了的代码风格,这...