动态定义调用方法

作者:周星 发布:2017-10-07

       我们知道,在 ruby 中调用方法很简单,类似于其它编程语言,只要在对象上使用(.)即可,比如:@user.play,即是调用了 @user 对象上的 play 方法,事实上 ruby 提供了一种动态调用方法的方式,send,举个例子:

class MyClass
  def my_method(my_arg)
    mr_arg * 2
  end
end
# 常规调用方法
obj = MyClass.new
obj.my_method(3)      #  => 6

# 使用 send 方法
obj.send(:my_method, 3)   # => 6

        以上两种方法都调用了 my_method 方法,但是第二种方法使用了更灵活的 send() 方法,send() 方法的第一个参数是你要发送给对象的消息,即方法名,既可以是符号也可以是字符串,按照习惯一般使用符号,这是 ruby 中的一个很“酷”的特性,通过 send() 方法,你想调用的方法名可以成为一个参数,这种技术元编程里把它成为“动态派发”,还记得我们上次分享最后附加的小代码吗,读取一个 yaml 文件为一个对象,其中最重要的一行:

s.send("#{k}=".to_sym, v)

       下面我们再看如何动态的定义方法,大家都知道在 ruby 中定义方法很简单,只要使用 def 关键字就可以,但是如果我们不确定方法的名字呢?或者需要在程序执行过程中按需定义方法呢?使用 define_method() 方法可以定义一个方法,只需要为其提供一个方法名和一个充当主体的块即可:

class MyClass
  define_method :my_method do |my_arg|
    my_arg * 3
  end
end

obj = MyClass.new
obj.my_method(2)  # => 6

define_method() 方法在 MyClass 内部执行,因此 my_method()定义为 MyClass 的实例方法,元编程把这种在运行时定义方法的技术成为动态方法。

现在我们学会了如何动态的定义方法和动态的调用方法,就可以尝试着重构一下我们写过的重复内容比较多的代码了。我们将在下一次分享 ruby 中更加灵活的 method_missing 方法。


如果您对本次分享有什么意见或建议,请联系博主。

支付宝扫码赞助博主


评论(0)