为什么使用符号?

Ruby 类库中的某些方法将符号(symbol)指定为参数。当然,如果你需要调用这些方法,则必须将符号传递给它们。但是,除了这些情况之外,没有绝对的要求你在自己的编程中使用符号。对于许多 Ruby 程序员来说,“常规”(conventional)数据类型(如字符串和整数)就足够了。

但是,符号确实在“动态”(dynamic)编程中占有特殊的地位。例如,Ruby 程序能够在运行时(runtime)通过在某个类的作用域内调用 define_method 来创建一个新方法,符号表示要定义的方法以及块表示该方法的代码:

add_method.rb
  1. class Array
  2. define_method( :aNewMethod, lambda{ |*args| puts( args.inspect) } )
  3. end

执行上面的代码后,Array 类将获得一个名为 aNewMethod 的方法。你可以通过调用 method_defined? 并传入表示方法名称的符号来验证这一点:

  1. Array.method_defined?( :aNewMethod ) #=> returns: true

当然,你本身也可以调用该方法:

  1. [].aNewMethod( 1,2,3 ) #=> returns: [1,2,3]

你可以在运行时(runtime)以类似的方式删除现有的方法,在类中调用 remove_method,并传入提供被删除的方法的名称符号:

  1. class Array
  2. remove_method( :aNewMethod )
  3. end

动态编程在需要程序仍在执行时修改 Ruby 程序本身的行为的应用程序中是非常有用的。例如,动态编程广泛用于 Rails 框架中。