ArrayのサブクラスXがある場合、doingX#to_a
は配列オブジェクトをX#to_ary
返し、doingはxオブジェクトを返します。
それto_a
は「配列に変更できる」という意味であり、「to_ary
配列のように振る舞う」という意味では理解できますが、前者がクラスの変更を実装し、後者が実装しない理由がわかりません。
to_a
また、リスコフの置換原則の下で、配列のサブクラスを返すのに十分ではありませんか?
ArrayのサブクラスXがある場合、doingX#to_a
は配列オブジェクトをX#to_ary
返し、doingはxオブジェクトを返します。
それto_a
は「配列に変更できる」という意味であり、「to_ary
配列のように振る舞う」という意味では理解できますが、前者がクラスの変更を実装し、後者が実装しない理由がわかりません。
to_a
また、リスコフの置換原則の下で、配列のサブクラスを返すのに十分ではありませんか?
「それが定義されている方法だから」で十分ですか?
to_a
を返します
self
。のサブクラスで呼び出された場合、レシーバーをオブジェクトArray
に変換します。Array
to_ary
を返します
self
。
おそらくそうではないので、ここでウサギの穴に入ります。
文書がこれが現状であると明確に述べているという事実を超えて、推論はおそらくマッツらによってのみ真に答えられるでしょう。
to_ary
暗黙の型変換が発生するときに使用されるように見えますが、掘り下げます。暗黙的な変換の使用は、この機能要求にも反映されているようです。つまり、オブジェクトがに応答する場合、そのオブジェクトはto_ary
として扱われる必要がありArray
、内部でこのように使用されます。したがって、サブクラスではなくto_a
、を(明示的に)必要とする場合に適しています。Array
はい、サブクラスを返すことはLSPを満たします(サブクラスがそうならないように動作を根本的に変更することを決定しないと仮定しArray
ます)が、原則はサブクラスがその基本クラスの代わりになる可能性があることを述べているだけであり、する必要があります。とにかく、ここで問題になるかどうかはわかりませんがto_a
、明示的に別のオブジェクトを要求しているため(上記の暗黙的な変換についての推論に沿って)、代わりのオブジェクトは必要ないと言っているためです。オブジェクトタイプ。
原則として、暗黙の変換はインタープリターによって自動的に呼び出され、必要とされたが見つからなかったタイプに非常によく似たもののみを変換することを目的としています。
ただし、明示的な変換は、ある種の極地航路または迂回路を伴う場合でも、ポイントaからポイントbに到達する方法がある限り、異なるタイプで呼び出すことができます。
したがって、to_aを使用して飛躍するためのより多くの自由がありますが、Xで十分であるように思われることに同意します。