ユーザーcashfoleyは、PSClassと呼ばれる「モジュール」のコードプレックスにかなりエレガントなコードセットのように見えるものを投稿しました。
psclassコードを自分のコードにドットソースすると、次のようなコードを記述できます。
$Animal = New-PSClass Animal {
constructor {
param( $name, $legs )
# ...
}
method -override ToString {
"A $($this.Class.ClassName) named $($this.name) with $($this.Legs) Legs"
}
}
しかし、PSClassコードからモジュールを作成しようとすると、エラーが発生し始めました。constructor
とmethod
名前は認識されなくなりました。
実際の実装を見るとconstructor
、、method
などは実際にはNew-PSClass関数内にネストされた関数であることがわかります。
したがって、PSClass.ps1ファイルをドットソース化すると、スクリプトブロックに他のローカル関数内にネストされた関数への参照を含めることができるように見えます。しかし、PSClassコードがモジュールになり、New-PSClass関数がエクスポートされると(マニフェストとExport-ModuleMemberの両方を使用してみました)、名前は表示されなくなります。
入れ子関数のスクリプトブロック、スコープルール、および可視性ルールがどのように連携するかを誰かに説明してもらえますか?
また、別の方法として、純粋なPowershellスクリプト用のより優れたクラス定義プロトコルはありますか?(具体的には、「C#で記述してからこれを実行するだけです...」を含まないもの)