心配しないで。このような場合、Rubyは少し注意が必要です。コードを1行ずつ調べてみましょう。
x = [1,2,3]
x.send :[]=,0,2
x[0] + x.[](1) + x.send(:[],2)
最初の行
最初の行は明らかです。3つの要素の配列をxに割り当てます。そして、それだけです。
二行目
2行目は、シンボルObject#sendを渡すメソッドを呼び出しxます(で始まるものはすべて:、rubyのシンボルであることに注意してください):[]=、0(a Fixnum)、および2(another Fixnum)。
ここで、sendメソッドが何をするかを確認する必要があります(すでに行ったと言ったように):
シンボルで識別されるメソッドを呼び出し、指定された引数を渡します
これは、によって識別されたメソッドを呼び出して、それに:[]=渡すこと0を意味し2ます。Array#[]=それでは、メソッドを見てみましょう。このメソッド定義(必要に応じてオーバーロードすることができます)は次のとおりです。
class Array
# ...
def []=(a, b)
# ...
end
end
このメソッドは、私に言わせればかなり醜いものsendとして呼び出されます。x.[]=(0, 2)これが、Rubyがシンタックスシュガーバージョンを定義している理由x[0] = 2です。
x.[]=(a, b) --> x[a] = b
このArray場合、次のものもあります。
x.[](a) --> x[a]
どちらの場合も、特定のコンテキストで意味のあるバージョンを自由に呼び出すことができます。
3行目
次に、3行目と最後の行について説明します。
x[0] + x.[](1) + x.send(:[],2)
物事は本当にトリッキーになります。それを次のように分けましょう:
x[0]
x.[](1)
x.send(:[], 2)
最初のものはかなり簡単です。配列の最初の要素を返します。
2つ目は、前に見たシンタックスシュガーで、基本的には配列の2番目の要素を返すように変換できます。x[1]
3つ目は、渡されるObject#sendメソッドを呼び出すために使用します。これは、それが呼び出すことを意味します。[]2x.[](2)x[2]
結論
コード
x = [1,2,3]
x.send :[]=,0,2
x[0] + x.[](1) + x.send(:[],2)
以下を使用して変換できます:
x.send(:[]=, a, b) --> x.[]=(a, b)
x.send(:[], a) --> x.[](a)
x.[]=(a, b) --> x[a] = b
x.[](a) --> x[a]
に:
x = [1,2,3]
x[0] = 2
x[0] + x[1] + x[2]
これは次のように減らすことができます:
2 + 2 + 3
その結果:
7