我想使用一些方便的util方法;尤其是Enumerable#to_a
符合Enumerable
合同的对象(即实施each
),但不包括Enumerable
。
我发现这似乎有效:
Enumerable.instance_method(:to_a).bind(obj).call
但这似乎真的很罗嗦而且没有Rubyesque。这样做有更好/更清洁/更快的方法吗? 我不想修改底层对象以避免无意的后果。
基本上,我正在寻找javascript的apply
或call
。
编辑:我的动机基本上是封装:我想对我没有写的类中的对象执行此操作,不要控制,不需要真正理解深度,并且可能对自己的方法可能被通用实现替换的反应很糟糕。我意识到只包括Enumerable在大多数情况下会起作用,但是当它出错时,它很容易调试,所以如果有一个简单的方法来获得mixin的好处而不是那么具有侵略性,我宁愿这样做。
答案 0 :(得分:1)
听起来无论出于何种原因,您不希望将类定义修改为include Enumerable
,但您当然也可以扩展特定实例。
所以你已经指出obj
实现each
所以你可以这样做:
obj.extend(Enumerable).to_a
啊,从你原来的问题我认为目标是不修改类,所以扩展实例是最合乎逻辑的解决方案。但是,听起来你不想修改类或任何实例。
我会做以下事情:
obj.to_enum.to_a