Send
你可以使用 send
方法调用与指定符号同名的方法:
send1.rb
name = "Fred"
puts( name.send( :reverse ) ) #=> derF
puts( name.send( :upcase ) ) #=> FRED
虽然 send
方法被记录为需要符号参数,但你也可以使用字符串参数。或者,为了保持一致性,你可以使用 to_sym
进行转换,然后使用相同的名称调用该方法:
name = MyString.new( gets() )
methodname = gets().chomp.to_sym #<= to_sym is not strictly necessary
name.send(methodname)
下面是在运行时使用 send
调用输入的命名方法的示例:
send2.rb
class MyString < String
def initialize( aStr )
super aStr
end
def show
puts self
end
def rev
puts self.reverse
end
end
print("Enter your name: ") #<= Enter: Fred
name = MyString.new( gets() )
print("Enter a method name: " ) #<= Enter: rev
methodname = gets().chomp.to_sym
puts( name.send(methodname) ) #=> derF
回想一下我们先前(dynamic.rb)如何使用 send
来创建一个新方法,通过调用 define_method
并向其传递要创建的方法的名称 m
和包含新方法代码的块 &block
:
dynamic.rb
def addMethod( m, &block )
self.class.send( :define_method, m , &block )
end