1. ホーム
  2. ruby-on-rails

[解決済み] RubyのArrayクラスには、なぜto_aメソッドとto_aryメソッドがあるのですか?

2022-02-18 19:32:46

質問

を呼び出すようなユースケースはあるのでしょうか? Array.to_aArray.to_ary を、すでにArrayになっているオブジェクトに適用できますか?

そうでない場合、なぜこれらのメソッドが Array クラスの中に存在するのでしょうか?

解決方法は?

<ブロッククオート

すでにArrayであるオブジェクトに対して、これらの強制メソッド(Array.to_aおよびArray.to_ary)を呼び出すようなユースケースはあるのだろうか。

はい:Rubyでは、一般的に 決して オブジェクトがどのクラスのインスタンスであるかを気にします。それができることだけだ。つまり、「このオブジェクトは自分自身を配列に変換できるのか」ということだけを気にするわけです。もちろん、配列はそれ自身を配列に変換することができますので、そのようなメソッドを持つ必要があります。

少し長い答えになりますが、もしオブジェクトがどのクラスのインスタンスであるかを気にしないのであれば、なぜそれ自身を配列に変換できるかどうかを気にするのでしょうか?それは現実的な選択です。オブジェクトから 純粋に OOの観点では、それは重要ではないはずです。しかし、実行エンジンのコアの奥深くで実装されるある種のオペレーションは が必要です。 オブジェクトは、効率とパフォーマンスの理由から、特定のクラスであることが必要です。言い換えれば、オブジェクトではダメで、抽象データ型が必要な場合もあるのです。

例えば、Rubyの実行エンジンの中には、「Ruby.com」の内部メモリのレイアウトを把握していることを利用した操作があります。 Array s. 明らかに、これらのオペレーションは ではなく an Array で、そのオブジェクトのメモリに突っ込みに行く。純粋にOOの観点から言えば、これらの操作はそのことを知るべきでなく、そのような操作は Array のパブリック・インターフェイスがありますが、残念ながら、そうではありません。しかし、あなた(プログラマ)が独自の配列のようなオブジェクトのために逃げ道を用意するために、これらの操作によってあなた自身を Array を呼び出すことで、まず to_ary .

つまり to_ary は、オブジェクトが一種の配列であることを意味します。明らかに、配列は配列の一種であり、そのため to_ary .

Rubyには他にも似たような変換方法があります。 to_str を文字列のために使用します。 to_int は整数の場合です。 to_float は浮動小数点数です。 to_proc は関数です。

また、一文字のバリエーションもあります。長い異形は、"I を意味します。 本当に のインスタンスでないだけです。 Array その代わり、「自分を配列として表現することができる」という意味になります。

最も分かりやすいのは nil に応答します。 to_i (を表現するのは、ちょっと意味があるからです)。 nil を整数で表すと 0 ) には反応しませんが to_int (なぜなら nil ではない は、異なる服装では整数であり、全く別のものです)。

配列や整数なども実装されているのは to_a , to_ary , to_i , to_int などを扱うことができるということです。 すべて 配列のようなオブジェクトをポリモーフィックに同じように扱うことができます。配列でもスタックでもセットでもツリーでも列挙体でもレンジでも何でもいいんです。なんとなく配列として表現できるものであれば、それは to_a である限り、そして実際に 配列(たとえそのクラスが Array ) に反応します。 to_ary をチェックする必要はありません。 は関係ないからです。 .

しかし、理想的にはこのような状況は稀であるべきであることに注意してください。一般的には、例えば、オブジェクトがそれ自身を反復できるかどうか(すなわち、それが each ). 実際、配列でできることのほとんどは、他の任意の Enumerable を使わなくても to_ary または to_a . これらは最後の手段であるべきです。