今日も心の声はダダもれ
~~ああ、サボりたい。~~みなさんこんにちは。
動的型付の言語で、あえて型付をするのは、インテリセンスでサボりたいから
可読性やメンテナンス性、データ型の保証などの理由からです。
動機は単純
C#でいつも使っているList<T>
って便利ですよね。
PowershellにあるPSCustomObject、なんとなく使いたくないです。
いつも使っている便利なものを持ちこんで、面倒なことはサボりたい。
自分の作業の効率化のためにも、どう使うのか見てみましょう。
とりあえず宣言してみよう
「C#で書くと、Listはこうなりますね。」
List<string> SharpList = new List<string>();
SharpList.Add("So Smart!");
「う~ん、Powershellだとどう書くんでしょう?」
「ふむふむ、こうやるのか。」
$DullList = New-ObjectGeneric -className List -typeParameters "string"
※問題はここからです。
要素を追加してみよう
「初期化もできたし、追加してみましょう。」
$DullList.Add("feel heavy....")
(なんだと?ありえない!) ピリオドを打った時点で入力候補が出ないではないですか!!
入力補完機能でサボりたいな。ラクしようと思ったのに逆効果ですよ。 素早く入力できるといいですよね。
他の方法は?
「他の書き方もあるらしいですね!」
$InertList = New-ObjectGeneric List "string"
「やってみましょう。」
$InertList.Add("feel so tired....")
「ああ、これもダメだ。」
インテリセンスが欲しい
インテリセンスが効く書き方は無いのか探していたら、ありました。
$HappyList = New-Object System.Collections.Generic.List[string]
「初期化しているので、さっそく要素の追加ですね。」
「入力候補が出ましたね!」
$HappyList.Add("feel light!!★!☆!★!☆!★!☆!★!☆!★!☆!★!☆!★!☆!★!☆!★!☆!")
「なんだかハッピー過ぎて、お星さまが出てしまいました。お恥ずかしい。」
ちなみに
「こんな書き方でも入力候補が出ました。」
$HappyList = New-Object System.Collections.Generic.List[string]
$HappyList = [System.Collections.Generic.List[string]]::new()
[System.Collections.Generic.List[string]]$HappyList = [System.Collections.Generic.List[string]]::new()
「とてもハッピーになれそうです。」
辞書はどう?
Listはインテリセンス使って上手くやれそうです。
それでは辞書も同じようにできるといいですね。
Dictionary<string,List<string>> SharpDict = new Dictionary<string,List<string>>();
SharpDict.Add("So Smart", new List<string>{"be", "so", "smart", "!"});
C#だとこんな感じですね。
だるいやつ入力候補が出ない方法
$DullDict = New-ObjectGeneric -className Dictionary -typeParameters ("string",$list.GetType().FullName)
$InertDict = New-ObjectGeneric Dictionary ("string", $list.GetType().FullName)
入力候補が出る方法?
「同じライブラリにあるクラスなので、当然のようにDictionaryも同じ書き方で大丈夫ですよね!」
$UnHappyDict = New-Object [System.Collections.Generic.Dictionary[[string,string]]]
「きっとそうですよ!宣言して、次は…」
$UnHappyDict.Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!
「入力候補、出ないじゃないですか!激おこですよ!」
今度こそ
これはムズムズしますね。同じライブラリなのにどうして挙動が違うのでしょうか?
そういえば、List
の時、別の書き方でもインテリセンス効きましたよね?
「試してみましょうか。」
$HappyDict = [System.Collections.Generic.Dictionary[string, string]]::new()
「さあ、早く出して欲しいです。」
「んっ!これは!」
$HappyDict.Add("It came out!","Oh Yeah!")
「いっぱい出ましたね。入力候補が!ハッピーになれそうです。」
どうやら
「インテリセンスを効かせて書こうと思うと、これがベストなようですね。」
$HappyWay = [T[T]]::new()
もっとラクしたい
C#の時って、Listの時には、List<T>
って書けば使えましたよね。
あれって、あらかじめusing System.Collections.Generic;
を書いていたからです。
Powershellだと、毎回[System.Collections.Generic.List[T]]
って長々書かなければいけないのでしょうか?
そんなのは嫌です。「アンパンマンマーチ」の「♪そ~んなのは い~やだ!」の部分を歌いたいです。
どうなの出来るの?
ググってみましょう!ぐぐらびりてぃ(Googlability)は最低ですが、何とか見つかりました!公式ドキュメントに書いてあるのは内緒。
「これを、ps1ファイルの先頭に書いておけば、」
using namespace System.Collections.Generic
「先ほどのロングスタイル初期化は、なんと!」
[List[string]]$HappyList = [List[string]]::new()
「こんなに短く出来てしまいました!」
これで言うことなし
本当に良かったです!これでみんなハッピー!
「そうですか?それで満足なんですか?え?」
「なんか聞こえるー。幻聴かなー。」
「こういうのはどうするんだい?」
List<List<int>> DevilList = new List<List<int>>();
「ああ、見たくないものが見える。目を背けよう」
「さあ、このC#のコードをPowershellで表現してみなさい。」
「もしできなければ…お前のたま」
「やめて!お嫁に行けなくなっちゃう!」
「…」
ネストもできる
「めげずにやってみましょう。」
[List[List[int]]]$AngelList = [List[List[int]]]::new()
「インテリセンスは、」
$AngelList.Add()
「効きました!」
あれ?初期化どうやるの?
「これ、初期化ってどうやると思う?」
「C#だと、こう書くやつ」
AngelNestList.Add(new List<int> { 1, 2, 3 });
「やべーわかんねー」
「こんなのもあるよな」
List<List<int>> AngelNestList = new List<List<int>>{
new List<int>{1,2,3},
new List<int>{4,5,6},
new List<int>{7,8,9},
};
「もうやだ!だれか助けてー!」
「こんにちは!普通のGeneric Listはこうやって初期化するのよ」
[List[string]]$LinearList =[List[string]]@("1","2","3")
Write-Host $LinearList[2]
「うわ!マジ天使!」
「てことは、ネストするときはこんな感じかな??」
[List[List[int]]]$GoList =[List[List[int]]]@(
@(1,2,3),
@(4,5,6),
@(7,8,9)
)
Write-Host $GoList[1][1]
「やった!ちゃんと5が表示された!」
「ありがとう天使さん!…あれ?いない…。」
辞書は?
「どうやら、初期化までインテリセンスを効かせられたようだな」
「はい!おかげさまで!スパルタ指導ありがとうございます。」
「それじゃあ、Dictionary<T>
の初期化はどうするかな?こんなやつ」
List<Dictionary<string, string>> MyFamily = new List<Dictionary<string, string>>()
{
new Dictionary<string, string>{{Name = "Mickey"},{Kind = "Mouse"}},
new Dictionary<string, string>{{Name = "Pluto"},{Kind = "Dog"}},
};
「もうつかれた!PSCustomObjectで代用するから許して~~~~~!」
$MyFamily = [List[PSCustomObject]]@(
[PSCustomObject]@{ Name = "Mickey"; Kind = "Mouse" },
[PSCustomObject]@{ Name = "Pluto"; Kind = "Dog" }
)
Write-Host $MyFamily[0].Kind
さて、続きはまたの機会に…。
ごめんなさい
「インテリセンス」の事を、「入力補完」と言ったり、「入力候補」と言ったりして分かりにくいかもです。ご容赦ください。
また、「この書き方もあるよ!」みたいなものがございましたら、コメントにて教えていただけると、はしゃぎます。
Excelsior!