ブログ「サイバー少年」

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

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

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 スクリプト クラス メソッド ジェネリックス 文法 推論

数学の勉強について雑記…

今回の記事は本当に雑記です。
話を体系的に書くという意識がまったく感じられないものであります。

つまりはクソ記事であるということをご承知ください。


私は最近、数学が好きなので、数学の特に数学基礎論という部分について勉強したり考え事していたりするのですが、

…もしかして自分には数学の才能がないのではないかと思ってしまいますね。


まず数学において重要な、発想力が私は大きく欠如していますね。
だから証明しろとか言われても、どのようにすればいいのかわからない。

答えを見ずに自分の力でなんらかの知見を生み出すことができないのは、数学をやる人間としてどうかという感じですね。

無から何かを探すというのは、すごく考えのフィールドが広すぎて、探索しきれないということですね。

まあ、このフィールドの広さの中で知見を生み出すためには、問題を小さく分割してちょっとずつ考えて、
小さな結論をひとつずつ出していって、最後に大きな結論を出すというのが必要になると思うんですが、

なんか私の場合、大雑把になってしまうということですね…。
たぶん、脳のワーキングメモリが足りないので、細分化しても忘れちゃうんですね。

全体を一気に考えないと頭の中のイメージが崩れてしまうというか。
でも、全体を一気に考えるなんて、大きすぎて出来ないということです。

さらに、有限のものに対してはイメージできるとしても、無限のものはイメージ出来ないので、苦手ですね。

たとえば数学的帰納法とかも、苦手です。


さて一方で、すでに答えが書かれてあるときに、答えを読んで理解する力というのは、まあまあかなと思うのですが、

それでも理解力も足りないと、思ってしまいますね…。

いや、なんというか書かれてあるイメージが、日本語に書き下せる場合と、日本語にできない場合があると思うんです。

日本語で考えられるものであればわりと理解できるんですが、日本語にできないものは苦手ですね。
イメージをイメージのままにして考える力がないんですかねぇ…。

続きを読む

tag: 数学 集合 順序 関係 論理学 述語論理 公理 勉強 偉人 ワーキングメモリ

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