我正在学习如何在模块中使用class_eval(我对class_eval有点熟悉)并在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
Run Code Online (Sandbox Code Playgroud)
在这种情况下做什么__FILE__
和__LINE__
做什么?我知道__FILE__
引用当前文件,但整件事究竟做了什么?真的不知道如何搜索:).
Ale*_*yne 54
__FILE__
并且__LINE__
是一种动态常量,用于保存当前正在执行的文件和行.将它们传递到此处允许错误正确报告其位置.
instance_eval <<-end_eval, __FILE__, __LINE__
def foo
a = 123
b = :abc
a.send b
end
end_eval
foo
Run Code Online (Sandbox Code Playgroud)
当你运行它
$ 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
Run Code Online (Sandbox Code Playgroud)
注意它表示文件和第5行,即使这只是eval中的文本.如果没有那些文件/行技巧,输出将如下所示:
$ ruby foo.rb
(eval):5:in `send': undefined method `abc' for 123:Fixnum (NoMethodError)
from (eval):5:in `foo'
from foo.rb:11
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪只显示(eval)
哪些没有帮助.