割とモダンにコードが書けると言うことは知られてないですね。
多分名前がshellなので現場レベルではshellと同じような、もしくはvbsと同じようなコードを書く人も多いです。※以下はわざと少し冗長に書いてますが…
$sourceList = Get-ChildItem -File | Foreach-Object {
return [PSCustomObject]@{
Name = $_.Name
Exist = $false
}
}
# 関数(第一級オブジェクト)
$existCheck = {
param([PSCustomObject[]]$ls)
return $ls | Foreach-Object {
return [PSCustomObject]@{
名前 = $_.Name
結果 = if(Test-Path $_.Name) {
“⚪︎”
} else {
“×”
}
# powershell core 以降ならば
# 結果 = Test-Path $_.Name ? “⚪︎” : “ד
}
}
}
$checkedList = & $existCheck -ls $sourceList
$checkedList
こういうことができると思われてないところが過小評価されてるなぁと言う気がします。
型については、クラス指向ではもう少しオーバーロードやジェネリクス宣言欲しいとかはありますが、データの状態遷移・運搬という意味合いではPSCustomObject、list, コマンドレット、畳み込み関数などで事足ります。
また、Enumが型としての振る舞いをしてくれるのがあって、よく利用します。
※ enumとPSCustomObject を組み合わせるとtypescriptのユニオン型っぽく書くこともできます。
Enum Mode {
ALT,
CREATE,
DELETE
}
# 型として利用する
[Mode]$mode = “ALT” # Enum で宣言したものしか入らない
# stringリテラルを入れてますが [Mode]$mode = [Mode]::ALT と同義
# string や int にキャストはできるものの、その型の値として直接代入はできない(型安全)
# union型っぽく , 代数的データ型としては遠いですが
$obj = [PscustomObject]@{
Mode = [Mode]::CREATE
Name = “hoge”
}
$obj.Mode # CREATE
# switch 文などで分岐させると良い
Shell と書いているため誤解されますが、.Netで動く以上ランタイムなので、標準出力などの仕様はJavaなどと同じでランタイム側が初期処理時に開けるものとなっています。(標準出力ストリームやらと言われてるのがそうです。厳密にはこれも仮想らしいのですが)
そのギャップに困惑してる人もいるみたいですね。
総じて私個人の評価としてはクラス指向言語や今までのshellを書いていた人にとっては書きづらい部分があるが、割と関数型的な思想がある分最近のjavascriptやtypescriptを書いてる人は入りやすいのではないかなと感じてます。