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

Ruby学习八 ->元编程 - __FILE__ 和 __LINE__ 的作用

 
阅读更多

Ruby 元编程 - __FILE__ 和 __LINE__ 的作用

http://www.cnblogs.com/darkbaby123/archive/2011/06/11/ruby_metaprogramming_file_line.html

前言

Ruby 元编程中,经常可以看到各种 eval 和 heredoc 的结合。其中很多用 heredoc 的位置都会出现 __FILE__ 和 __LINE__ 这两个变量。本文介绍一下它们的作用,以及为什么要这样做。

正文

先看一个用 class_eval 动态生成实例方法的例子:

01 class A
02    def self .my_attr_reader(*args)
03      args. each do |method|
04        class_eval <<- EOF , __FILE__ , __LINE__
05          def #{method}
06            raise "#{method}"
07          end
08        EOF
09      end
10    end
11 end

这是模仿 Ruby 的 attr_reader 的代码,当然实现简化过了,关键是,它会抛出异常。我们待会再解释为什么这样做。现在先大概解释下代码。

class_eval 是 Ruby 中 eval 的一种,它的上下文是调用它的对象,也就是类 A 。它通常用来为类生成实例方法,用法就像上面代码中的那样。你可以传把一段 Ruby 代码写在一个字符串中传过去,class_eval 就会动态解释 Ruby 代码。这和 Javascript 中的 eval 十分类似。

heredoc 就是被 EOF 包起来的那部分。它实际上是一个多行的字符串,EOF 只是一个标识,代表 heredoc 的开始和结束,你可以随意换成其他玩意。用 heredoc 的好处之一是可以不用操心单引号和双引号的问题,还有就是把代码写在多行看得比较清楚。喜欢深挖的可以看看 这个链接

第4行 EOF 后面的 __FILE__ 和 __LINE__ 是两个特殊变量,它们保存了当前文件的名字和当前代码的行数。其实 heredoc 后面不加这两个变量也可以。比如这样也是合法的:

 

1 class_eval <<- EOF
2 EOF

那加了它们有什么好处呢?

主要还是在测试方面。我们可以用如下代码测试一下:

1 A .class_eval do
2    my_attr_reader :name
3 end
4  
5 a = A . new
6 a.name      # 会抛出异常,异常信息为 name

把这段代码和上面第一段放在一起,保存成 Ruby 文件(我保存成 test.rb),再用解释器执行,会看到如下的错误:

1 # test.rb:5:in `raise': exception object expected (TypeError)
2 #     from test.rb:5:in `name'
3 #     from test.rb:18

可以看到,异常信息会提示你错误出在 test.rb 第5行的 name 方法内。即使 name 方法是用元编程手段动态产生的。

现在我们把 EOF 后面的 __FILE__ 和 __LINE__ 去掉。再运行下代码,会看到如下的结果:

 

1 # (eval):2:in `raise': exception object expected (TypeError)
2 #     from (eval):2:in `name'
3 #     from test.rb:18

可以看到,异常信息最后是从 eval 中抛出来的,最多只能看到18行调用 name 的那一行出错了,但看不到 name 方法在哪定义的。这样对 debug 几乎没有帮助,尤其是当程序复杂的时候。比如 Rails 就使用了大量元编程技巧。

所以,__FILE__ 和 __LINE__ 在这里就是为了方便 debug 的。它们并不会对元编程动态创建的方法有任何影响。

分享到:
评论

相关推荐

    ruby1-导出-1.pdf

    根据提供的文件内容,我们可以整理并深入探讨Ruby编程语言中的一些核心概念和技术要点: ### Ruby 数据类型及操作 #### 数字类型 - **Number**: 包括整数 (`int`) 和浮点数 (`float`)。 - 整数:用于表示没有小数...

    Pycharm 简单使用教程.docx

    - **显示行号**:在编辑器右下角点击显示行号图标或通过“设置”菜单中的“Editor -&gt; General -&gt; Appearance -&gt; Show line numbers”选项开启。 - **安装插件**:通过“设置”菜单中的“Plugins -&gt; Browse ...

    Ruby1.91_Stable和Gem1.3.5

    Ruby 1.9.1 和 Gem 1.3.5 是 Ruby 编程语言的关键版本,它们在软件开发中扮演着重要角色。Ruby 1.9.1 是 Ruby 的一个稳定分支,它引入了许多改进和新特性,提升了性能并增强了语言的规范性。 Ruby 1.9.1 的主要更新...

    ruby初学者教程(对初学者很有帮助)

    #### 二、Ruby编程环境搭建 **2.1 安装Ruby** - **Windows平台**:可以通过RubyInstaller进行安装,安装过程中可以选择是否添加Ruby到系统的PATH环境中。 - **Linux平台**:大多数Linux发行版都提供了Ruby的软件包...

    Ruby程序设计.doc

    - **__FILE__,__LINE__和SCRIPT__LINES__:** 获取当前执行位置的信息。 #### 十三、序列化和YAML 这部分内容未给出详细章节,但可以从上下文推断,这部分可能涉及Ruby中的序列化技术以及YAML格式的使用。 以上...

    ruby文件操作,简单ppt

    ### Ruby 文件操作详解 在 Ruby 编程语言中,对文件进行操作是非常常见的需求之一,无论是...通过学习这些内容,开发者可以更好地理解和掌握 Ruby 中文件操作的相关知识,从而在实际开发过程中更加高效地完成任务。

    Ruby入门教程

    - **12.5.3 __FILE__,__LINE__和SCRIPT_NAME__**:提供关于当前执行位置的信息。 #### 十三、序列化和YAML **13.1 序列化的概念** 序列化是将对象转换为可以存储或传输的格式的过程。 综上所述,Ruby作为一种...

    Ruby读写txt文件

    Ruby是一种强大的动态编程语言,广泛应用于Web开发、脚本编写以及各种系统自动化任务。在处理文本数据时,如读写txt文件,Ruby提供了简洁而直观的API。下面将详细介绍Ruby如何进行txt文件的读写操作。 一、打开和...

    Ruby-TraceLocation可以帮助您跟踪代码的源位置并帮助您阅读Ruby中庞大的开放源库

    Ruby是一种强大的动态编程语言,广泛用于Web开发、脚本编写以及构建复杂的软件系统。在处理大型的Ruby开源库时,理解和调试代码变得尤为关键。`TraceLocation` 是一个实用工具,它为开发者提供了追踪代码执行路径的...

    ruby 读取cfg文件

    在Ruby编程语言中,读取配置文件(如cfg文件)是一项常见的任务,这通常涉及到从文件中获取特定的键值对以供程序使用。在本篇文章中,我们将深入探讨如何在Ruby中有效地读取和处理cfg文件,以及如何根据指定的键来...

    趣学Python编程 书中源代码

    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读取INI文件

    Ruby是一种动态且灵活的编程语言,它在处理各种文件格式时提供了丰富的库支持。当我们谈论“Ruby读取INI文件”时,我们指的是使用Ruby代码解析和操作INI配置文件。INI文件是一种简单的文本文件格式,常用于存储软件...

    ruby-1.8.2.tar.gz

    3. **语法改进**:Ruby 1.8.2 包括对 Ruby 语法的一些改进,如引入了 `__FILE__` 和 `__LINE__` 特殊变量,它们分别返回当前执行的文件名和行号,方便调试和日志记录。 4. **块和迭代器**:在这个版本中,块的处理...

    RUBY基础入门指南

    #### 二、Ruby编程环境 **2.1 Ruby的安装** - **在Windows上安装Ruby**:通过RubyInstaller项目下载对应版本的安装包,安装过程中可以选择安装Devel工具包以便开发使用。 - **在Linux上安装Ruby**:可以通过包管理...

    Ruby语言教程.docx

    ### Ruby语言教程知识点详解 #### 一、Ruby简介与特性 - **定义**:Ruby是一种动态、面向对象的脚本语言。 - **特点**: - **简洁性**:Ruby的语法简洁明了,易于阅读。 - **动态性**:Ruby支持动态类型和动态...

    Ruby元编程的一些值得注意的地方

    避免无限循环的元编程。  写一个函数库时不要使核心类混乱(不要使用 monkey patch)。  代码块形式最好用于字符串插值形式。  当你使用字符串插值形式,总是提供 __FILE__ 和 __LINE__,使得你的回溯有意义。 ...

    以下是一个非常详细的Ruby语言教程.docx

    通过学习这些内容,你可以掌握 Ruby 的基本语法和面向对象编程的核心概念,并能进行简单的 Web 应用开发。在实际应用中,建议多加练习,编写实际的小程序来加深理解和记忆。如有疑问或需要更深入的解释,欢迎随时...

    ruby开发答疑借鉴.pdf

    Ruby是一种高级的、动态类型的编程语言,以其优雅的语法和强大的功能而受到开发者喜爱。本问答主要面向已有编程经验但对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...

Global site tag (gtag.js) - Google Analytics