ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

PowerShellでジェネリックス!

またPowerShellの記事ですが、今回はいつものように長々と書くのではなく、当ブログではすごく久しぶりにメモ程度の記事です。

…と思っていたら、またまた長くなってしまった。
短くまとめられる能力が欲しいですね。


PowerShellでは型を意識しない書き方をできるようになっていますが、ジェネリックスを相手にする場合は型を明示しなければなりません。

そこで、今回はジェネリッククラスとジェネリックメソッドをどのように呼び出せばよいか書きます。

実は私も昔、何回か気にした問題なのですが、その度に忘れるので今回こそメモします。



ジェネリッククラス

まず知っていただきたいのは、型引数をn個持つジェネリッククラスは、PowerShellにおいて本当の名前はその型名に'`n'をくっつけたものであるということです。

つまりは、'System.Collections.Generic.List<T>'とC#で呼ばれているものは、PowerShellでは'System.Collections.Generic.List`1'になって、
'System.Collections.Generic.Dictionary<TKey, TValue>'なら、'System.Collections.Generic.Dictionary`2'となります。


しかし実際のところPowerShellでは、型名を書いたあと型引数を続けて書かなければならないので、そこから推論することが可能です。
つまりは、この数字を後につけることは、あまりないと思います。


静的クラス

まずは静的メンバにアクセスするために、ジェネリッククラス名を書く場合の方法です。
まず型名を[]で囲むわけですが、さっき実験して驚いたことがありまして、

PowerShellの以前のバージョンでは型名を[]で囲んだものを書いてエンターを押しても、別にメソッドを呼んでいるわけでもないのでエラーになっていました。

しかし、先ほどv5.0で実験してみたところ、[]で囲んだ型名だけでも、それはSystem.Typeのインスタンスとして解釈されるようになったようです。

そして[]の後に書く::は、左の[]と結びついている記号じゃなくなり、
左のSystem.Typeが表す型に定義されている静的メンバにアクセスする記号という意味に変わったということです。

これが何を意味するかというと、

$type = '文字列'.GetType()
$type::FullName


こういう変数を介したアクセスが可能になったということです。


さて、本題に戻しますが、要するに話はジェネリッククラスのSystem.Typeをどのように作るかという問題になります。

これは、すごく単純に、まず型名を書いて、そのあと任意で前述の'`n'を付加します。

そして、そのあと[]を付加して、この中に型引数を書きます。
型引数が複数あるなら、','で区切ります。

そして、この時点で型名を書くことができたということになるのですが、ここからSystem.Typeを作るために、全体を[]で囲みます。

よってたとえば、'[System.Collections.Generic.List[string]]'とか、'[System.Collections.Generic.Dictionary[int,string]]'ということになります。

あとは::を書いて普通にメンバ名を書くだけです。

続きを読む

tag: PowerShell スクリプト クラス メソッド ジェネリックス 文法 推論

PowerShellでクラス定義!

PowerShellの記事を結構、書きそうなので「PowerShell」カテゴリを作りました。

C#」カテゴリはまだ3件しか記事を書いてないんですね。

そういえば余談ですが、C# 6.0の新機能を調べてみたらあんまり面白いものがありませんでした。

C#はもう、これ以上いじったら最初のものと離れすぎるし、そろそろ保守的な時期に入ったのでしょうかね。

それに比べ、PowerShellのこの頃の進化はヤバイです。


Windows10ではBashが使えるようになるらしいですね。
Ubuntu互換のシステムを搭載して、その上でLinux用のBashをそのまま動かすみたいです。

私はBashがどんなものなのかよく知らないのですが、すごく喜ばしいことのようです。

Bashって便利なんですかね。
PowerShellもなかなか便利だと思うんですけどね。

というか、PowerShellのほうが全然新しいでしょうし、オブジェクトのパイプラインもあるし、

PowerShellは一行のコマンドを書くのも、大きなスクリプトを書くのも柔軟に対応できるし、PowerShellのほうが本当は凄いんだと思います。


「WindowsのCUI環境はクソだ」とよく言われますが、それはコマンドプロンプトのほうだけ見ての意見なんじゃないでしょうか。

私はコマンドプロンプトのほうは使えないので、コマンドプロンプトが如何ようにクソなのか存じ上げませんが…。


まあ、Linuxなど他社の技術との親和性を求める人はWindows上でもBashを使うようになると思うので、
PowerShellには、もうふっきれて、親和性度外視でオレ仕様を作りまくってほしいですね。

私はせっかくPowerShellを覚えたので、PowerShellについていきたいと思います。

続きを読む

tag: PowerShell スクリプト CUI クラス メソッド 継承 オブジェクト指向 ダックタイピング

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。