Kernel#eval

前面我们了解了 instance_eval() 方法和 class_eval() 方法,现在我们看看 eval() 方法(它也是一个内核方法)。从某种意义上说,Kernel#eval() 方法是这三个中最直接的,它不是使用块,而是直接使用包含 Ruby 代码的字符串—-简称 代码字符串。Kernel#eval() 方法会执行字符串中的代码,并返回执行结果:

  array = [10, 20]
  element = 30
  eval("array << element")  #=> [10, 20, 30]

Strings of Code vs. Blocks

instance_eval() 方法和 class_eval() 方法除了块,其实也可以接受代码字符串作为参数。字符串中的代码与块中的代码并没有太大的区别,代码字符串甚至可以像块那样访问局部变量:

  array = ['a', 'b', 'c']
  x = 'd'
  array.instance_eval "self[1] = x"

  array    #=> ["a", "d", "c"]

由于代码字符串和块非常相似,因此,在很多情况下,可以选择使用任意一种。但是只要能用块就尽量用块,因为代码字符串有一些缺点。