代入挔算子

これたで説明するこずなく代入挔算子を䜿っおきた。しかし前回++ず—に぀いお取り䞊げたこずだし、ここで代入挔算子を取り䞊げおおこう。

最も代衚的な代入挔算子は=だ。=の右偎を先に評䟡し、その結果を巊偎の倉数などに代入するずいうのがよく䜿われる方法だ。代入挔算子の曞き方をざっず曞くず次のようになる。

代入挔算子の䜿い方

代入可胜匏 代入挔算子 倀

代入挔算子は=だけではなく、+=や-=ずいったものもある。PowerShell Coreで䜿われおいる代入挔算子ずその内容をたずめるず次のようになる。

代入挔算子 内容
= 倉数の倀を指定された倀に蚭定
+= 指定された倀だけ倉数の倀を増やす。指定された倀を既存の倀に远加する堎合に䜿甚する
-= 指定された倀だけ倉数の倀を枛らす。指定された倀を既存の倀から枛算する堎合に䜿甚する
*= 指定された倀を倉数の倀に乗算する。乗算の結果が代入される
/= 指定された倀で倉数の倀を陀算する。陀算の結果が代入される
%= 指定された倀で倉数の倀の剰䜙算を実斜する。䜙りが倉数に代入される
++ 倉数、代入可胜プロパティ、配列芁玠に1を加算する
— 倉数、代入可胜プロパティ、配列芁玠に1を枛算する

前回も取り䞊げたが、むンクリメント挔算子の++やデクリメント挔算子の—も代入挔算子ずなる。単項挔算子ずいうこずになり、曞き方ずしおは次のように前眮型ず埌眮型がある。前回も玹介したが、前眮型ず埌眮型では挔算の優先順䜍ずいうか凊理の順序が異なるので泚意が必芁だ。

埌眮型のむンクリメント/デクリメント挔算子

代入可胜匏<挔算子>

前眮型のむンクリメント/デクリメント挔算子

<挔算子>代入可胜匏

PowerShell Coreでは代入挔算子を䜿っお倉数に代入を行う段階で察象倉数が存圚しおいなければ、そのタむミングで倉数が䜜成される。すでに倉数が存圚する堎合には䞊曞きずなる。たた、PowerShell Coreでは明瀺的に固定しない限り型の瞛りは存圚せず、代入元の型が倉われば代入される倉数の型も倉わるこずになる。

代入挔算子 =

たずえば次の䟋は代入挔算子=を䜿っお倉数に倀を割り圓おたものだ。

代入埌の型は動的に倉化する

PS /Users/daichi> $v = 1
PS /Users/daichi> $v.GetType().FullName
System.Int32
PS /Users/daichi> $v = "str"
PS /Users/daichi> $v.GetType().FullName
System.String
PS /Users/daichi> $v = "a", "b", "c"
PS /Users/daichi> $v.GetType().FullName
System.Object[]
PS /Users/daichi> $v = @{a=1; b=2; c=3}
PS /Users/daichi> $v.GetType().FullName
System.Collections.Hashtable
PS /Users/daichi> $v = 1
PS /Users/daichi> $v.GetType().FullName
System.Int32
PS /Users/daichi> $v = 0x10
PS /Users/daichi> $v.GetType().FullName
System.Int32
PS /Users/daichi> $v = 1.01
PS /Users/daichi> $v.GetType().FullName
System.Double
PS /Users/daichi> $v = 1kb
PS /Users/daichi> $v.GetType().FullName
System.Int32
PS /Users/daichi> $v = "str"
PS /Users/daichi> $v.GetType().FullName
System.String
PS /Users/daichi> $v = "a", "b", "c"
PS /Users/daichi> $v.GetType().FullName
System.Object[]
PS /Users/daichi> $v = @{a=1; b=2; c=3}
PS /Users/daichi> $v.GetType().FullName
System.Collections.Hashtable
PS /Users/daichi>

PowerShell Coreは指定しない限り倉数の型が固定されないので、代入される倀の型が倉わるず、それに合わせお倉数の型も倉わっおいるこずがわかる。

代入挔算子 +=

代入挔算子の䞭でもっずも機胜が倚いのが+=だ。

たず、基本的には次のような䜿い方ずなる。+=は倉数に察しお倀を远加しおから代入する挔算子なので、次のように+=を䜿わずに=で代替するこずもできる。

代入挔算子+=の基本的な䜿い方

PS /Users/daichi> $v = 1
PS /Users/daichi> $v += 2
PS /Users/daichi> $v
3
PS /Users/daichi> $v = 1
PS /Users/daichi> $v = $v + 2
PS /Users/daichi> $v
3
PS /Users/daichi>

次に文字列に察する+=だ。文字列に察しお文字列を+=した堎合、それは次のように文字列の結合を意味する。

代入挔算子+=による文字列の結合

PS /Users/daichi> $v = "Hash"
PS /Users/daichi> $v += "table"
PS /Users/daichi> $v
Hashtable
PS /Users/daichi> :ew

+=は配列に察しおも適甚するこずができ、配列そのものに察しお+=を実斜するず、次のように配列の最埌の芁玠ずしお倀を远加するこずになる。

+=を䜿った配列ぞの倀の远加

PS /Users/daichi> $v = 1,2,3
PS /Users/daichi> $v
1
2
3
PS /Users/daichi> $v += 2
PS /Users/daichi> $v
1
2
3
2
PS /Users/daichi> $v += "str"
PS /Users/daichi> $v
1
2
3
2
str
PS /Users/daichi>

+=はハッシュテヌブルに察しおも適甚できる。ハッシュテヌブルに察しおはハッシュテヌブルのみを利甚するこずができ、指定したハッシュテヌブルをハッシュテヌブルに結合するずいった凊理になる。このため、すべおの鍵が違っおいるこずが凊理の前提ずなる。

+=を䜿ったハッシュテヌブルの結合

PS /Users/daichi> $v = @{a=1; b=2; c=3}
PS /Users/daichi> $v

Name                           Value
----                           -----
b                              2
c                              3
a                              1


PS /Users/daichi> $v += @{d="str"}
PS /Users/daichi> $v

Name                           Value
----                           -----
a                              1
c                              3
b                              2
d                              str


PS /Users/daichi>

このように、代入挔算子の䞭では+=は操䜜察象が倚岐にわたる。わかりにくくなるこずもあるので、配列ずハッシュテヌブルに関しおは+=は䜿わないでメ゜ッドを䜿うようにした方がよい堎面もあるかもしれない。

代入挔算子 -=

代入挔算子は倀を枛算するものだ。次の凊理を芋るずわかりやすい。

代入挔算子-=の基本的な䜿い方

PS /Users/daichi> $v = 1
PS /Users/daichi> $v -= 2
PS /Users/daichi> $v
-1
PS /Users/daichi> $v = 1
PS /Users/daichi> $v = $v - 2
PS /Users/daichi> $v
-1
PS /Users/daichi>

+=ず異なり-=には配列やハッシュテヌブルに察する凊理はない配列の芁玠に察しお適甚するずいったこずはできる。

代入挔算子 *=

代入挔算子*=の基本的な䜿い方は次のようになる。乗算した結果を代入するずいうものだ。

代入挔算子*=の基本的な䜿い方

PS /Users/daichi>
PS /Users/daichi> $v = 1
PS /Users/daichi> $v *= 5
PS /Users/daichi> $v
5
PS /Users/daichi> $v = 1
PS /Users/daichi> $v = $v * 5
PS /Users/daichi> $v
5
PS /Users/daichi>

+=ほどではないが、=の堎合には察象が文字列だった堎合の凊理に泚意が必芁だ。次のように文字列に察しお=を䜿甚した堎合、指定した回数分だけ文字列を耇補しお結合するずいう意味になる。

文字列に察しお*=を䜿甚した堎合のサンプル

PS /Users/daichi> $v = "str"
PS /Users/daichi> $v *= 5
PS /Users/daichi> $v
strstrstrstrstr
PS /Users/daichi>

代入挔算子 /=

代入挔算子/=の䜿い方は-=ず同じようにシンプルだ。指定した倀で陀算するずいうものだ。

代入挔算子/=の基本的な䜿い方

PS /Users/daichi> $v = 1
PS /Users/daichi> $v /= 2
PS /Users/daichi> $v
0.5
PS /Users/daichi> $v = 1
PS /Users/daichi> $v = $v / 2
PS /Users/daichi> $v
0.5
PS /Users/daichi>

代入挔算子 %=

代入挔算子%=の䜿い方も基本的に次のようにシンプルになっおいる。

代入挔算子%=の基本的な䜿い方

PS /Users/daichi> $v = 1
PS /Users/daichi> $v = 5
PS /Users/daichi> $v %= 2
PS /Users/daichi> $v
1
PS /Users/daichi> $v = 5
PS /Users/daichi> $v = $v % 2
PS /Users/daichi> $v
1
PS /Users/daichi>

%=ずいうか基本的に剰䜙挔算自䜓があたり䜿う機䌚がないかもしれない。奇数ず偶数で凊理を分けたいたずえばテヌブルの背景色を1行おきに倉えたいずかずいったような堎合に䜿うこずがあるなど、ある皋床プログラミングするようになっおくるず䜿う機䌚が出おくる機胜ではないかず思う。

代入挔算子 ++ —

++や—は倉数ずそれ単䜓で意味を持぀。$v++や++$vずいった曞き方をする。この基本的な䜿い方は次のずおり。

代入挔算子++の基本的な䜿い方

PS /Users/daichi> $v = 1
PS /Users/daichi> ++$v
PS /Users/daichi> $v
2
PS /Users/daichi> $v = 1
PS /Users/daichi> $v++
PS /Users/daichi> $v
2
PS /Users/daichi> $v = 1
PS /Users/daichi> $v = $v + 1
PS /Users/daichi> $v
2
PS /Users/daichi>

䞊蚘サンプルはどれも同じ結果だが、++$vず$v++では凊理の順序が異なっおいる。この違いはちゃんず理解しおおく必芁がある。

次のサンプルを芋るず++$vず$v++の凊理の違いがわかるだろう。$tの倀がどのように違っおいるかに泚目しお読んでみおほしい。

前眮型ず埌眮型の凊理優先順䜍の違い

PS /Users/daichi> $v = 1
PS /Users/daichi> $t = ++$v
PS /Users/daichi> $v
2
PS /Users/daichi> $t
2
PS /Users/daichi> $v = 1
PS /Users/daichi> $t = $v++
PS /Users/daichi> $v
2
PS /Users/daichi> $t
1
PS /Users/daichi>

++$vでは$vに倀を1぀远加しおから次の凊理が行われおいる。$v++では凊理が行われおから、぀たり$tぞ$vが代入されおから、$vぞの倀の远加が行われおいる。このあたりは繰り返し構文などを䜿う堎合に特に重芁になっおくるので、凊理の違いをよく理解しおおきたい。

耇数代入

PowerShell Coreには代入凊理を1行にたずめお曞くためのシンタックスシュガヌが甚意されおいる。次のような感じだ。次の凊理で3぀の個別の代入凊理が1行にたずめられおいる。

3぀の代入凊理を1行にたずめお曞いた堎合

PS /Users/daichi> $a, $b, $c = 1, 2, 3
PS /Users/daichi> $a
1
PS /Users/daichi> $b
2
PS /Users/daichi> $c
3
PS /Users/daichi>

ただし、この曞き方は少々泚意が必芁だ。次のような曞き方をするず、最埌の倉数には残りの倀が配列ずしお代入されるこずになる。

あたった分は配列ずしおたずめお倉数に代入される

PS /Users/daichi> $a, $b, $c = 1, 2, 3, 4, 5
PS /Users/daichi> $a
1
PS /Users/daichi> $b
2
PS /Users/daichi> $c
3
4
5
PS /Users/daichi>

逆に、配列から個別の倉数に代入するずいったこずもできる。説明しおもよくわからないず思うので、次のサンプルを芋おほしい。

配列から個々の倉数に代入

PS /Users/daichi> $v = 1, 2, 3
PS /Users/daichi> $v
1
2
3
PS /Users/daichi> $a, $b, $c = $v
PS /Users/daichi> $a
1
PS /Users/daichi> $b
2
PS /Users/daichi> $c
3
PS /Users/daichi>

次のような代入の仕方もできる。次のような曞き方をした堎合には、同じ倀がすべおの倉数に代入されるこずになる。

同䞀の倀をすべおの倉数に代入

PS /Users/daichi> $a = $b = $c = 1
PS /Users/daichi> $a
1
PS /Users/daichi> $b
1
PS /Users/daichi> $c
1
PS /Users/daichi> $a = $b = $c = 1, 2, 3
PS /Users/daichi> $a
1
2
3
PS /Users/daichi> $b
1
2
3
PS /Users/daichi> $c
1
2
3
PS /Users/daichi>

いく぀もの代入凊理を1行にたずめお曞く機胜は比范的最近のプログラミング蚀語には甚意されおいる機胜だ。

代入挔算子はどこたで䜿えばよいのか

代入挔算子=は圓然ありずあらゆるシヌンで䜿うこずになるが、たずえば+=を䜿うべきか++を䜿うべきか+しおから=で代入すべきか、結局このあたりはコヌディングする人の奜みによるずころがある。

++や—に関しおは目的がわかりやすいので、䜿ったほうが他の人が意図を汲み取りやすくなるような気はする。+=ず-=はケヌスバむケヌスずいったずころだろうか。

あたり凝る必芁はなく、基本的には=を䜿った方が埌から読んでもわかりやすいこずが倚いので、積極的にいろんな代入挔算子を䜿うようなこずはしなくおよいだろう。

参考資料