Send

你可以使用 send 方法调用与指定符号同名的方法:

send1.rb
  1. name = "Fred"
  2. puts( name.send( :reverse ) ) #=> derF
  3. puts( name.send( :upcase ) ) #=> FRED

虽然 send 方法被记录为需要符号参数,但你也可以使用字符串参数。或者,为了保持一致性,你可以使用 to_sym 进行转换,然后使用相同的名称调用该方法:

  1. name = MyString.new( gets() )
  2. methodname = gets().chomp.to_sym #<= to_sym is not strictly necessary
  3. name.send(methodname)

下面是在运行时使用 send 调用输入的命名方法的示例:

send2.rb
  1. class MyString < String
  2. def initialize( aStr )
  3. super aStr
  4. end
  5. def show
  6. puts self
  7. end
  8. def rev
  9. puts self.reverse
  10. end
  11. end
  12. print("Enter your name: ") #<= Enter: Fred
  13. name = MyString.new( gets() )
  14. print("Enter a method name: " ) #<= Enter: rev
  15. methodname = gets().chomp.to_sym
  16. puts( name.send(methodname) ) #=> derF

回想一下我们先前(dynamic.rb)如何使用 send 来创建一个新方法,通过调用 define_method 并向其传递要创建的方法的名称 m 和包含新方法代码的块 &block

dynamic.rb
  1. def addMethod( m, &block )
  2. self.class.send( :define_method, m , &block )
  3. end