[]演算子オーバーロードとインデクサの違いって何?
abdev 3 Comments »何度も話に出てきている通り、開発者向けにコッソリとリリースさせてもらっているAB5β4ではString型への添え字アクセスへの対応が微妙です(新String型への移行を全く行っていないAB5CP1では問題ないです)。例えば、
Dim s As String Dim c As Char s="test" c=s[0]
このような記述は可能なのですが、下記のコードは未だエラーとなってしまいます。
Dim s As String s="test" s[0]=Asc("a")
本来であれば、文字列sの内容が “aest” に変化してほしいところ。AB5β4では、
s[0]=Asc(“a”)
の表記を
s.Chars[0]=Asc(“a”)
というふうにして一時的に凌いでもらうようお願いしているところです。しかしながら、AB4用に開発したソースコードにおいて、このようなStringアクセスが生じている部分をすべて書き換えてくださいなというお願いをするのは非常に酷な話ですし、AB5のうたい文句である下位互換性の信憑性を揺るがす問題であることも事実です。
そこで、[]演算子のオーバーロードロジックにもう一段階ひねりを加え、添え字アクセスによる代入も可能にしようと考えています。まず思い浮かぶのがC#で採用されるインデクサ。例えば、下記のようなコードでオブジェクトへの添え字アクセス(読み書き)を可能にしてくれます。
public class C { int[] values = { 1, 2, 3 }; public int this[int index] // インデクサの宣言. { get { return values[index]; } set { values[index] = value; } } } public class TestIndexer { public static void Main() { C c = new C(); c[1] = 1; // インデクサを使用した書き込み. Console.WriteLine(c[1]); // インデクサを使用した読み込み. } }
“public int this[int index]” という部分のindexの型をstringなどに書き換えれば、連想配列のような機能も実現可能とのこと。get/setアクセサを指定して云々というのがインデクサの仕様のようですが、このget/setアクセサに相当する演算子オーバーロード機能を盛り込むことで、完全にインデクサの仕様をカバーできるような気がします。例えば、先ほどのコードを次バージョンのABを想定して書き直すと、下記のような表現になります。
Class C values[3] As Long Sub C() values[0]=1 values[1]=2 values[2]=3 End Sub 'getアクセサ相当 Function Operator[] (index As Long) As Long Return values[index] End Function 'setアクセサ相当 Sub Operator[]= (index As Long, value As Long) values[index]=value End Sub End Class Dim pobj As C() pobj[1]=1 Print pobj[1]
当然ながら、Operator / Operator= のパラメータであるindexの型を書き換えることで、連想配列のように扱うことも可能になります。こうなってくると、オーバーロードチックに記述するのか、get/setアクセサを指定して記述するのかの違いなだけで、事実上はインデクサの機能と同等になるのではないかと考えられます。
どちらが直感的であるのかは使い手によって意見が食い違うところでしょう。私もC#を利用して積極的にインデクサという機能を使い込んだことがありませんので、両者が本当に同一の機能を提供するものなのかどうか、厳密にはわかりませんが、特段問題がなければ[]=演算子のオーバーロードを導入してそれをABのインデクサとして扱いたい考えです。
Recent Comments