[解決済み] RubyのArrayクラスには、なぜto_aメソッドとto_aryメソッドがあるのですか?
質問
を呼び出すようなユースケースはあるのでしょうか?
Array.to_a
と
Array.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
. これらは最後の手段であるべきです。
関連
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Rubyで「例外 => e」を救済するのはなぜ悪いスタイルなのですか?
-
[解決済み] イコール、エクル、==、==の違いは何ですか?
-
[解決済み] Rubyのmapとcollectの違い?
-
[解決済み] Ruby、execとsystemと%x()またはBackticksの違いについて
-
[解決済み】Rubyのメソッドで感嘆符が使われるのはなぜ?
-
[解決済み】Rubyで配列を反復処理するための「正しい」方法は何ですか?
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?
-
[解決済み] なぜRubyにはprivateとprotectedの両方のメソッドがあるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み] Railsです。NameError: 初期化されていない定数
-
[解決済み] gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] Ruby on rails "No route matches" (ルートに一致するものがない)。
-
[解決済み] railsでhidden fieldタグを使用する方法
-
[解決済み] Ruby:Rubyの配列にinclude.の反対はある?
-
[解決済み] Heroku: 既存のrailsアプリにseeds.rbをプッシュする方法?
-
[解決済み] Ruby on rails アプリで ES6 (ES2015) を使用するにはどうすればよいですか?
-
[解決済み] rails/rubyでgroup_byを使用する。