在阅读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
部分去掉以减少它。我试着用一个字符串作为输入,一个符号作为输入,等等。由于某种原因,这段代码不起作用。有人知道为什么吗? 最佳答案
gets
从STDIN
读取一行;“line”定义为以换行符(\n
结尾)的字符串。因此,您试图调用不存在的方法"size\n"
。使用chomp
删除换行符:
loop { p explore_array(gets.chomp) }
在第一个例子中,这并不重要,因为您正在评估代码
"['a', 'b', 'c'].size\n"
,它仍然有效。