在不包含mixin的对象上调用mixin的方法

时间:2013-07-19 14:10:32

标签: ruby coding-style

我想使用一些方便的util方法;尤其是Enumerable#to_a符合Enumerable合同的对象(即实施each),但不包括Enumerable

我发现这似乎有效:

Enumerable.instance_method(:to_a).bind(obj).call

但这似乎真的很罗嗦而且没有Rubyesque。这样做有更好/更清洁/更快的方法吗? 我不想修改底层对象以避免无意的后果。

基本上,我正在寻找javascript的applycall

编辑:我的动机基本上是封装:我想对我没有写的类中的对象执行此操作,不要控制,不需要真正理解深度,并且可能对自己的方法可能被通用实现替换的反应很糟糕。我意识到只包括Enumerable在大多数情况下会起作用,但是当它出错时,它很容易调试,所以如果有一个简单的方法来获得mixin的好处而不是那么具有侵略性,我宁愿这样做。

1 个答案:

答案 0 :(得分:1)

听起来无论出于何种原因,您不希望将类定义修改为include Enumerable,但您当然也可以扩展特定实例。

所以你已经指出obj实现each所以你可以这样做:

obj.extend(Enumerable).to_a

啊,从你原来的问题我认为目标是不修改类,所以扩展实例是最合乎逻辑的解决方案。但是,听起来你不想修改类或任何实例。

我会做以下事情:

obj.to_enum.to_a