5

ArrayのサブクラスXがある場合、doingX#to_aは配列オブジェクトをX#to_ary返し、doingはxオブジェクトを返します。

それto_aは「配列に変更できる」という意味であり、「to_ary配列のように振る舞う」という意味では理解できますが、前者がクラスの変更を実装し、後者が実装しない理由がわかりません。

to_aまた、リスコフの置換原則の下で、配列のサブクラスを返すのに十分ではありませんか?

4

2 に答える 2

3

「それが定義されている方法だから」で十分ですか?

to_a

を返しますself。のサブクラスで呼び出された場合、レシーバーをオブジェクトArrayに変換します。Array

to_ary

を返しますself

おそらくそうではないので、ここでウサギの穴に入ります。

文書がこれが現状であると明確に述べているという事実を超えて、推論はおそらくマッツらによってのみ真に答えられるでしょう。

to_ary暗黙の型変換が発生するときに使用されるように見えますが、掘り下げます。暗黙的な変換の使用は、この機能要求にも反映されているようです。つまり、オブジェクトがに応答する場合、そのオブジェクトはto_aryとして扱われる必要がありArray、内部でこのように使用されます。したがって、サブクラスではなくto_a、を(明示的に)必要とする場合に適しています。Array

はい、サブクラスを返すことはLSPを満たします(サブクラスがそうならないように動作を根本的に変更することを決定しないと仮定しArrayます)が、原則はサブクラスがその基本クラスの代わりになる可能性があることを述べているだけであり、する必要があります。とにかく、ここで問題になるかどうかはわかりませんがto_a、明示的に別のオブジェクトを要求しているため(上​​記の暗黙的な変換についての推論に沿って)、代わりのオブジェクトは必要ないと言っているためです。オブジェクトタイプ。

于 2012-04-17T02:45:33.860 に答える
2

原則として、暗黙の変換はインタープリターによって自動的に呼び出され、必要とされたが見つからなかったタイプに非常によく似たもののみを変換することを目的としています。

ただし、明示的な変換は、ある種の極地航路または迂回路を伴う場合でも、ポイントaからポイントbに到達する方法がある限り、異なるタイプで呼び出すことができます。

したがって、to_aを使用して飛躍するためのより多くの自由がありますが、Xで十分であるように思われることに同意します。

于 2012-04-17T04:31:00.880 に答える