みなさんは a.[]= 0,1
という式を見たときに何が行われているかパッと理解できるでしょうか?
このとき変数 a は a = []
で初期化されているものとします
エラーが出るって? そんなことないんです
> a = []
=> []
> a.[]= 0,1
=> 1
一点注意で []
と=
の間にはスペースを入れないようにしてください
ピリオド.
も忘れないで
理由は後述します
1
ってなんだーと思ったそこのお方、ネタバラシをするとこの式は以下の式と等価です
a[0] = 1
配列に値を代入すると代入した値が戻り値として返ってくるのでこの1は配列aの0番目に1が代入された時の戻り値なのでした
しかしそもそもなんでこのような表記が可能なのでしょうか?
それは ruby において配列の要素の代入が Array クラスのインスタンスメソッドとして定義されているからです
公式のドキュメントを見てみましょう
インスタンスメソッドの枠に []=
という項目があり、self[nth] = val
という形式で nth 番目の要素を val に設定します
という記載があります
もちろん公式で推奨されている書き方ではないですが、配列の要素の代入はインスタンスメソッドですので、他のメソッドと同様に .
でチェーンして呼び出しても動きます
引数の 0,1
の部分はそれぞれ配列のインデックス、代入する値を表していて、これは rubyの実装 を見ればそうなっていることがわかります
rb_ary_aset(int argc, VALUE *argv, VALUE ary)
{
long offset, beg, len;
(中略)
return ary_aset_by_rb_ary_store(ary, offset, argv[1]);
}
中身の部分はおいておくとして、引数の順番としては最初に配列のインデックス、その後に値(バリュー)となっていることがわかります
他の言語で配列の要素の代入がどうなっているのかは知りませんが、rubyでこういう書き方ができるのはちょっと意外でした
しかし可読性が悪いのであえてこのような書き方をする機会はまずないと思います
トリビアの一つとして使ってください