`
java-admin
  • 浏览: 1381990 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

class_eval和module_eval方法

 
阅读更多

 

 

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

分享到:
评论

相关推荐

    写公共函数文件,要使用到类,将类传参进来.rb

    在这个例子中,`extend_class`函数接收一个类`klass`作为参数,并通过`class_eval`方法向这个类添加了一个新的实例方法`say_hello`。这样,我们就可以在任何使用了`UtilityModule`的类中为它们动态添加功能。 此外...

    metaprogramming_introduction:一篇以源代码形式介绍Ruby元编程基础知识的文章-Form source code

    通过`eval`, `send`, `instance_eval`, `class_eval`, 动态方法定义,以及`Proc`和`Lambda`等工具,开发者能够创建出更具适应性和可扩展性的代码。在实际项目中,合理利用元编程可以提高代码的效率和可维护性,但...

    Ruby元编程第二版中文

    `class_eval`和`module_eval`允许在类或模块上下文中执行字符串或块作为代码。 3. **对象的反射**:`Object#methods`、`Class#methods`等方法返回对象或类可调用的方法列表。`instance_variable_get`和`instance_...

    uninclude:实施Module#uninclude和Object#unextend

    实施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' 然后执行: $ ...

    编程之魂:Ruby中的元编程艺术

    例如,可以使用 `class_eval` 方法来动态地向类中添加新方法或修改现有方法。 #### 代码示例 ```ruby class Example def show "Original method" end end Example.class_eval do def show "Modified method" ...

    [Ruby完全自学手册].邓蔚.扫描版

    例如,读者将学习到如何使用 `class_eval` 和 `instance_eval` 动态定义类和方法,以及 `send` 方法的用法。 此外,本书还会涵盖Ruby的错误处理和异常处理机制,以及测试驱动开发(TDD)和集成测试的相关知识,帮助...

    ruby设计模式的代码有好多

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

    ruby-2.5.1

    `eval`函数可以执行字符串作为Ruby代码,`send`方法可以动态调用对象的方法,而`instance_eval`和`class_eval`则可以在特定上下文中执行代码,极大地增加了代码的灵活性。 在Ruby 2.5.1中,标准库也得到了增强,...

    ruby API资料

    `class_eval`和`instance_eval`等方法是实现元编程的关键。 - **块和 Proc**:Ruby的块(代码块)是通过`do..end`或花括号`{}`包裹的代码片段,可以传递给方法。Proc对象可以捕获和存储一个代码块,使得它可以被多...

    ruby 中文文档 入门必学

    文档会讲解如何使用`send`方法动态调用方法,`class_eval`和`instance_eval`等方法改变类结构,以及定义方法的动态方式(如`define_method`)。 5. **异常处理**:Ruby中的异常处理使用`begin/rescue/ensure/end`...

    Ruby程序设计

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

    ruby入门教程

    例如,你可以使用`define_method`动态定义方法,或者使用`class_eval`或`instance_eval`来执行字符串中的代码,这在编写灵活的框架或库时非常有用。 此外,Ruby的标准库非常丰富,提供了大量实用的模块和函数。例如...

    ruby中文教程,从基础到深入的让你学习ruby

    Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`instance_eval`允许在运行时修改类或对象的行为。此外,Ruby的`send`方法可以动态调用方法,`method_missing`可以捕获未定义...

    元编程 Ruby

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

    ruby-1.8.6.zip

    例如,`class_eval` 和 `instance_eval` 方法允许在运行时添加或修改类和实例的方法。 7. **Gem 包管理**:虽然在 1.8.6 时代,RubyGems 已经存在,但当时包管理和依赖关系解决不如现在的版本那么成熟。安装和管理...

    ruby中文教程(源代码)

    - `module_function`和`extend`:这两个方法可以让你在模块中定义的方法在类或对象上直接调用。 5. **源代码实践** 本教程的源代码涵盖了以上概念,你可以通过阅读和运行代码来更好地理解Ruby的语法和特性。例如...

    Ruby语言教程大纲.zip

    - `send` 方法可以调用对象的任何方法,`class_eval` 和 `instance_eval` 可以在运行时定义或修改类和实例的行为。 6. **Gem和Rails框架** - Gem是Ruby的包管理系统,用于安装和管理第三方库。 - Rails是基于...

    Ruby中文文档.rar

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

    Ruby的学习和应用

    `class_eval`和`module_eval`方法可以让你在运行时向类或模块添加代码,`define_method`可以动态定义方法。 5. **Gem生态系统**:Ruby拥有丰富的第三方库,被称为Gems。这些Gems涵盖了各种用途,如Web开发(如Rails...

    《Ruby元编程》PDF版本下载.txt

    - **灵活性**:Ruby提供了丰富的API来支持元编程,如`eval`, `instance_eval`, `class_eval`等方法,使得在程序运行过程中动态地创建和修改代码成为可能。 - **简洁性**:Ruby的语法设计鼓励简洁明了的代码风格,这...

Global site tag (gtag.js) - Google Analytics