0

我想使用一些方便的 util 方法;特别是Enumerable#to_a在满足Enumerable合同(即实施each)的对象上,但不包括Enumerable.

我发现这似乎可行:

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

但这似乎真的很罗嗦而且不像Rubyesque。有没有更好/更清洁/更快的方法来做到这一点?我宁愿不修改底层对象以避免意外后果。

本质上,我正在寻找 javascriptapplycall.

编辑:我这样做的动机本质上是封装:我想对我没有编写、不控制、不需要深入理解的类中的对象执行此操作,并且可能对拥有自己的对象做出不良反应方法可能被通用实现取代。我意识到仅包含 Enumerable 在大多数情况下都可以工作,但是当它出错时,调试起来很麻烦,所以如果有一种简单的方法可以在不那么具有侵入性的情况下获得 mixin 的好处,我更愿意这样做。

4

1 回答 1

1

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

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

obj.extend(Enumerable).to_a

啊,从您最初的问题来看,我认为目标只是不修改类,因此扩展实例是最合乎逻辑的解决方案。但是,听起来您不想修改类或任何实例。

然后我会做以下事情:

obj.to_enum.to_a
于 2013-07-19T14:34:31.710 回答