心配しないで。このような場合、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
メソッドを呼び出すために使用します。これは、それが呼び出すことを意味します。[]
2
x.[](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