LoginSignup
1
0

a.[]= 0,1 を理解する

Last updated at Posted at 2023-08-19

みなさんは 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でこういう書き方ができるのはちょっと意外でした

しかし可読性が悪いのであえてこのような書き方をする機会はまずないと思います
トリビアの一つとして使ってください

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0