Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
课堂评估是什么<<-&引用;结束“评估”__文件、行在Ruby中是什么意思?_Ruby - Fatal编程技术网

课堂评估是什么<<-&引用;结束“评估”__文件、行在Ruby中是什么意思?

课堂评估是什么<<-&引用;结束“评估”__文件、行在Ruby中是什么意思?,ruby,Ruby,我正在学习如何在模块中使用class_eval(我对class_eval有点熟悉),并且遇到了一些问题。里面有这样的东西: class_eval <<-"end_eval", __FILE__, __LINE__ def #{block_accessor}(*args, &block) unless args.empty? && block.nil? args.push block if block_given? @#{b

我正在学习如何在模块中使用class_eval(我对class_eval有点熟悉),并且遇到了一些问题。里面有这样的东西:

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
$ ruby foo.rb 
(eval):5:in `send': undefined method `abc' for 123:Fixnum (NoMethodError)
    from (eval):5:in `foo'
    from foo.rb:11

class\u eval该
文件和
\uuuuuuuuuu行和
\uuuuuuu行
是一种动态常量,用于保存当前正在执行的文件和行。在这里传递它们允许错误正确地报告它们的位置

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

foo
请注意,它显示了文件和第5行,尽管这只是评估中的文本。如果没有这些文件/行技巧,输出将如下所示:

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
$ ruby foo.rb 
(eval):5:in `send': undefined method `abc' for 123:Fixnum (NoMethodError)
    from (eval):5:in `foo'
    from foo.rb:11

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

我们还要注意,如果可能,应避免使用
eval
-ling字符串。在您的特定情况下,可以将
#class_eval
替换为
#class_exec
,最好是:

class_exec do
  define_method block_accessor do |*args, &block|
    unless args.empty? && block.nil?
      args.push block if block_given?
      instance_variable_set "@#{block_accessor}", [args].flatten
    end
    instance_variable_get "@#{block_accessor}"
  end
end

但是…你不是来自无政府高尔夫的高尔夫巫师吗?你应该对鲁比了如指掌-D(这是对你关于
class\u eval
的行为是什么的陈述的轻率的评论。如果你的意图不是听起来不确定,我收回我的评论。)哈哈。。。我从不需要这个函数,因为它有太多的字符。在你的例子中,它会在错误消息之前添加文件名和行号。请看链接中的示例:使用
define\u方法
可能不需要这种技巧,而且不会打开漏洞(请参阅)