0

いくつかの便利な util メソッドを使用したいと思います。特に、コントラクト (つまり implement )Enumerable#to_aを満たすが、 を含まないオブジェクトについて。EnumerableeachEnumerable

私はこれがうまくいくように見えることを理解しました:

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

しかし、これは非常に長文で、Rubyesque ではないようです。これを行うためのより良い/よりクリーンな/より高速な方法はありますか? 意図しない結果を避けるために、基になるオブジェクトを変更しないことをお勧めします。

基本的に、私はjavascriptのapplyまたはcall.

編集:これに対する私の動機は本質的にカプセル化です:私が書いていない、制御していない、深く理解する必要のないクラスのオブジェクトに対してこれを行いたいです。独自のものを持つことにひどく反応するかもしれませんメソッドは、一般的な実装に置き換えられる可能性があります。ほとんどの場合、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 に答える