http://www.cnblogs.com/darkbaby123/archive/2011/06/11/ruby_metaprogramming_file_line.html
前言
Ruby 元编程中,经常可以看到各种 eval 和 heredoc 的结合。其中很多用 heredoc 的位置都会出现 __FILE__ 和 __LINE__ 这两个变量。本文介绍一下它们的作用,以及为什么要这样做。
正文
先看一个用 class_eval 动态生成实例方法的例子:
02 |
def self .my_attr_reader(*args) |
03 |
args. each do |method| |
04 |
class_eval <<- EOF , __FILE__ , __LINE__ |
这是模仿 Ruby 的 attr_reader 的代码,当然实现简化过了,关键是,它会抛出异常。我们待会再解释为什么这样做。现在先大概解释下代码。
class_eval 是 Ruby 中 eval 的一种,它的上下文是调用它的对象,也就是类 A 。它通常用来为类生成实例方法,用法就像上面代码中的那样。你可以传把一段 Ruby 代码写在一个字符串中传过去,class_eval 就会动态解释 Ruby 代码。这和 Javascript 中的 eval 十分类似。
heredoc 就是被 EOF 包起来的那部分。它实际上是一个多行的字符串,EOF 只是一个标识,代表 heredoc 的开始和结束,你可以随意换成其他玩意。用 heredoc 的好处之一是可以不用操心单引号和双引号的问题,还有就是把代码写在多行看得比较清楚。喜欢深挖的可以看看 这个链接 。
第4行 EOF 后面的 __FILE__ 和 __LINE__ 是两个特殊变量,它们保存了当前文件的名字和当前代码的行数。其实 heredoc 后面不加这两个变量也可以。比如这样也是合法的:
那加了它们有什么好处呢?
主要还是在测试方面。我们可以用如下代码测试一下:
把这段代码和上面第一段放在一起,保存成 Ruby 文件(我保存成 test.rb),再用解释器执行,会看到如下的错误:
可以看到,异常信息会提示你错误出在 test.rb 第5行的 name 方法内。即使 name 方法是用元编程手段动态产生的。
现在我们把 EOF 后面的 __FILE__ 和 __LINE__ 去掉。再运行下代码,会看到如下的结果:
可以看到,异常信息最后是从 eval 中抛出来的,最多只能看到18行调用 name 的那一行出错了,但看不到 name 方法在哪定义的。这样对 debug 几乎没有帮助,尤其是当程序复杂的时候。比如 Rails 就使用了大量元编程技巧。
所以,__FILE__ 和 __LINE__ 在这里就是为了方便 debug 的。它们并不会对元编程动态创建的方法有任何影响。
分享到:
相关推荐
根据提供的文件内容,我们可以整理并深入探讨Ruby编程语言中的一些核心概念和技术要点: ### Ruby 数据类型及操作 #### 数字类型 - **Number**: 包括整数 (`int`) 和浮点数 (`float`)。 - 整数:用于表示没有小数...
- **显示行号**:在编辑器右下角点击显示行号图标或通过“设置”菜单中的“Editor -> General -> Appearance -> Show line numbers”选项开启。 - **安装插件**:通过“设置”菜单中的“Plugins -> Browse ...
Ruby 1.9.1 和 Gem 1.3.5 是 Ruby 编程语言的关键版本,它们在软件开发中扮演着重要角色。Ruby 1.9.1 是 Ruby 的一个稳定分支,它引入了许多改进和新特性,提升了性能并增强了语言的规范性。 Ruby 1.9.1 的主要更新...
#### 二、Ruby编程环境搭建 **2.1 安装Ruby** - **Windows平台**:可以通过RubyInstaller进行安装,安装过程中可以选择是否添加Ruby到系统的PATH环境中。 - **Linux平台**:大多数Linux发行版都提供了Ruby的软件包...
- **__FILE__,__LINE__和SCRIPT__LINES__:** 获取当前执行位置的信息。 #### 十三、序列化和YAML 这部分内容未给出详细章节,但可以从上下文推断,这部分可能涉及Ruby中的序列化技术以及YAML格式的使用。 以上...
### Ruby 文件操作详解 在 Ruby 编程语言中,对文件进行操作是非常常见的需求之一,无论是...通过学习这些内容,开发者可以更好地理解和掌握 Ruby 中文件操作的相关知识,从而在实际开发过程中更加高效地完成任务。
- **12.5.3 __FILE__,__LINE__和SCRIPT_NAME__**:提供关于当前执行位置的信息。 #### 十三、序列化和YAML **13.1 序列化的概念** 序列化是将对象转换为可以存储或传输的格式的过程。 综上所述,Ruby作为一种...
Ruby是一种强大的动态编程语言,广泛应用于Web开发、脚本编写以及各种系统自动化任务。在处理文本数据时,如读写txt文件,Ruby提供了简洁而直观的API。下面将详细介绍Ruby如何进行txt文件的读写操作。 一、打开和...
Ruby是一种强大的动态编程语言,广泛用于Web开发、脚本编写以及构建复杂的软件系统。在处理大型的Ruby开源库时,理解和调试代码变得尤为关键。`TraceLocation` 是一个实用工具,它为开发者提供了追踪代码执行路径的...
在Ruby编程语言中,读取配置文件(如cfg文件)是一项常见的任务,这通常涉及到从文件中获取特定的键值对以供程序使用。在本篇文章中,我们将深入探讨如何在Ruby中有效地读取和处理cfg文件,以及如何根据指定的键来...
Chapter 2 Magic coins example. magic_coins1.py ...Hello World Ruby example. helloworld.rb Hello World Javascript example. helloworld.js Hello World Javascript Browser example. helloworld-js.html
Ruby是一种动态且灵活的编程语言,它在处理各种文件格式时提供了丰富的库支持。当我们谈论“Ruby读取INI文件”时,我们指的是使用Ruby代码解析和操作INI配置文件。INI文件是一种简单的文本文件格式,常用于存储软件...
3. **语法改进**:Ruby 1.8.2 包括对 Ruby 语法的一些改进,如引入了 `__FILE__` 和 `__LINE__` 特殊变量,它们分别返回当前执行的文件名和行号,方便调试和日志记录。 4. **块和迭代器**:在这个版本中,块的处理...
#### 二、Ruby编程环境 **2.1 Ruby的安装** - **在Windows上安装Ruby**:通过RubyInstaller项目下载对应版本的安装包,安装过程中可以选择安装Devel工具包以便开发使用。 - **在Linux上安装Ruby**:可以通过包管理...
### Ruby语言教程知识点详解 #### 一、Ruby简介与特性 - **定义**:Ruby是一种动态、面向对象的脚本语言。 - **特点**: - **简洁性**:Ruby的语法简洁明了,易于阅读。 - **动态性**:Ruby支持动态类型和动态...
避免无限循环的元编程。 写一个函数库时不要使核心类混乱(不要使用 monkey patch)。 代码块形式最好用于字符串插值形式。 当你使用字符串插值形式,总是提供 __FILE__ 和 __LINE__,使得你的回溯有意义。 ...
通过学习这些内容,你可以掌握 Ruby 的基本语法和面向对象编程的核心概念,并能进行简单的 Web 应用开发。在实际应用中,建议多加练习,编写实际的小程序来加深理解和记忆。如有疑问或需要更深入的解释,欢迎随时...
Ruby是一种高级的、动态类型的编程语言,以其优雅的语法和强大的功能而受到开发者喜爱。本问答主要面向已有编程经验但对Ruby不熟悉的读者,旨在帮助他们快速理解和阅读Ruby代码。 Ruby最有特色的语法形式之一是其...
第二章 Ruby编程环境 9 §2.1 Ruby的安装 9 §2.1.1 在Windows 95/98/Me/XP上安装Ruby 9 §2.1.2 在Linux上安装Ruby 10 §2.2 运行Ruby 10 §2.2.1 使用Ruby 10 §2.2.2 使用FreeRIDE和SciTE 11 §2.2.3 使用fxri 13...