在阅读Ruby2元编程的一章时,我在书中遇到了一个在执行代码时似乎不起作用的例子。

array_explorer.rb

def explore_array(method)
  code = "['a','b','c'].#{method}"
  puts "Evaluating: #{code}"
  eval code
end

loop { p explore_array(gets()) }

上面的代码旨在说明eval的威力。在下一个例子中,这本书讲述了代码注入的主要缺陷,并对代码进行了重构,以保护:
array_explorer.rb

def explore_array(method, *arguments)
  ['a','b','c'].send(method, *arguments)
end

loop { p explore_array(gets()) }

当我尝试运行上面的代码时,无论我尝试使用什么数组方法,文件都会给出这个错误。
array_explorer.rb:2:in `explore_array': undefined method `:size (NoMethodError)
' for ["a", "b", "c"]:Array

我试过把*arguments部分去掉以减少它。我试着用一个字符串作为输入,一个符号作为输入,等等。由于某种原因,这段代码不起作用。有人知道为什么吗?

最佳答案

getsSTDIN读取一行;“line”定义为以换行符(\n结尾)的字符串。因此,您试图调用不存在的方法"size\n"。使用chomp删除换行符:

loop { p explore_array(gets.chomp) }

在第一个例子中,这并不重要,因为您正在评估代码"['a', 'b', 'c'].size\n",它仍然有效。

10-07 14:56