我正在学习如何在模块中使用class_eval(我对class_eval有点熟悉),遇到了this helpful class in resource_controller个.里面有这样的东西:

class_eval <<-"end_eval", __FILE__, __LINE__

  def #{block_accessor}(*args, &block)
    unless args.empty? && block.nil?
      args.push block if block_given?
      @#{block_accessor} = [args].flatten
    end

    @#{block_accessor}
  end

end_eval

__FILE____LINE__在这种情况下做什么?我知道当前文件中有__FILE__个引用,但这整件事到底是做什么的呢?我真的不知道如何搜索:).

推荐答案

__FILE____LINE__是一种动态常量,用于保存当前正在执行的文件和行.在这里传递它们允许错误正确地报告它们的位置.

instance_eval <<-end_eval, __FILE__, __LINE__
  def foo
    a = 123
    b = :abc
    a.send b
  end
end_eval

foo

当你运行这个

$ ruby foo.rb 
foo.rb:5:in `send': undefined method `abc' for 123:Fixnum (NoMethodError)
    from foo.rb:5:in `foo'
    from foo.rb:11

请注意,它显示了文件和行#5,尽管这只是判断中的文本.如果没有这些文件/行技巧,输出将如下所示:

$ ruby foo.rb 
(eval):5:in `send': undefined method `abc' for 123:Fixnum (NoMethodError)
    from (eval):5:in `foo'
    from foo.rb:11

堆栈跟踪只显示(eval),这没有多大帮助.

Ruby相关问答推荐

Ruby脚本递归地创建深度嵌套的目录

RSpec 中有没有一种方法可以同时断言调用次数和参数列表?

在Ruby中按字母顺序对数组中的数组进行排序?

Ruby注入daisy链?

RVM 和 OpenSSL 的问题

Ruby 中的yield关键字有什么作用?

Ruby: initialize() vs 类体(class body)?

在ruby中反转数组的顺序

如何在不将换行符粘贴到字符串中的情况下使用puts添加额外的换行符?

如何在不使用 Ruby 保存到磁盘的情况下生成 zip 文件?

Ruby 对象打印为指针

Ruby:从字节创建一个字符串

Ruby 模块 - 包括 do 结束块

group_by 在 rails by 2 或更多属性

Ruby 和您必须使用 OpenSSL 支持重新编译 Ruby 或更改 Gemfile 中的源代码

Ruby 中 Array#reject 的反义词是什么?

如何在没有 Rails 的情况下使用 RSpec?

确定Ruby的位置

检索/列出 Redis 数据库中的所有键/值对

如何在 Ruby 中实现回调?