前提・実現したいこと
クラスの機能を勉強しています
functionを実装中に以下のエラーメッセージが発生しました。
このエラーをなくす方法を知りたいです。
発生している問題・エラーメッセージ
Missing '(' in class method parameter list Missing function body in function declaration
該当のソースコード
powershell
1class pstest { 2 [bool] $KeyAddress 3 function pstest{ 4 Param ( 5 #Target Registry Address 6 [Parameter(Mandatory)] 7 [string] 8 $KeyAddress, 9 # Target Property List 10 [Parameter(Mandatory)] 11 [List] 12 $KeyName 13 ) 14 $this.$KeyAddress 15 16 } 17 function test { 18 param ( 19 ) 20 return "a" 21 } 22} 23 24$testcase001 = New-Object pstest("Registry::HKCR\","Name") 25$testcase001.test 26
試したこと
paramの書き方や、エラーメッセージを検索しましたが、解決の糸口がつかめません。
補足情報(FW/ツールのバージョンなど)
######Vscode
- バージョン: 1.45.1 (system setup)
- コミット: 5763d909d5f12fe19f215cbfdd29a91c0fa9208a
- 日付: 2020-05-14T08:27:35.169Z
- Electron: 7.2.4
- Chrome: 78.0.3904.130
- Node.js: 12.8.1
- V8: 7.8.279.23-electron.0
- OS: Windows_NT x64 10.0.18363
######拡張機能
- ms-vscode.powershellを使用
######powershell
- PSVersion 7.0.1
- PSEdition Core
- GitCommitId 7.0.1
- OS Microsoft Windows 10.0.18363
- Platform Win32NT
- PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
- PSRemotingProtocolVersion 2.3
- SerializationVersion 1.1.0.1
- WSManStackVersion 3.0
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_classes?view=powershell-7
書き方が違います。
クラスの書き方を知らないのに関係ない Param をググって侍や Qiita を見ているから解決の糸口がつかめないのであって、クラスの書き方を知らなければクラスの書き方を公式ヘルプで調べればいいんです。
わからないことがあったらまず Get-Help about_ を実行します。すると、何かについて説明したドキュメント一覧が並ぶので、そこから見ていきます。
この場合は about_Classes を見ると解決できます。
公式ドキュメントのリンクありがとうございます。
about_functionsとabout_Classを読み返しました。
ドキュメントに項目が無いということは、クラス関数ではparam書式が使用できないんですね。
powershell好きだったんですが、初めて嫌いなところが出来ました。
Powershell拡張機能にて、`function`スニペットを使用すると、
```powershell
function FunctionName {
param (
OptionalParameters
)
}
```
と出てくるので、勘違いして思い込みをしていました。先入観が怖いです。
function って先頭につきっぱなしですけど、これは関数宣言の書式ではなくて、戻り値の型なんですね。
Pythonの拡張機能では`function`スニペットで、`class function`か`nomal`かなど、選択できます。そこから類推して、Powershellではどちらも同じ書式だから区別する必要が無いから、スニペットもこうなっていると思ってしまいました。
今考えると、Powershellの`function`スニペットは`normal`と`advance`、`inline`の3種ありますが、
ふつうはどれでも書けるけど、クラス関数だけは`inline`しか使えないということなのかなと推理できます。
いつも`https://docs.microsoft.com/`のブックマークから階層を降りていくか、「Microsoft Docs」を検索ワードに含めて検索していたので、`Get-Help about_ `という使い方があるのは知らなかったです。ありがとうございます。
いまさらに精読していまして、気が付いたのですが、
ひょっとして、Powershellではmethodとfunctionって別次元の存在なのですか?
クラスに書くのは PowerShell の function(コマンドレット)でなく、.NET のメソッドなので、別物と思っておけばいいと思います。
例えばパラメーターセットは PowerShell 独自のシステムなので、.NET メソッドでは使えません。
呼び出す時も、function は引数を空白区切りで与えますが、.NET メソッドはカッコで包んでカンマ区切りで与えます。
ありがとうございます。
ほかの言語と同じ考え方で、なんとなくでコーディングできるだろうと、甘く見ていました。Powershellは、ひと味違いました。
ただ構文を知らないだけではなく、概念が存在しないものを作ろうとしていたとは。改めて、先入観が怖いです。
本来の PowerShell のオブジェクト指向は、継承を持たないインスタンスベースなんですが、.NET のクラスベースのオブジェクトも使うことができるため、二種類のオブジェクト指向システムがあることになります。COM も入れれば三種類ですね。PowerShell を使って .NET クラスの作成まで行いたいという要望から生まれたのが class 構文です。三種類のシステムはそれぞれ設計思想が違うため、これらが違うものだという意識を持っておいた方が良いと思います。
継承が必要ないのであれば、Add-Member で NoteProperty や ScriptMethod を追加することでオブジェクトを扱うことができます。作られた当初はこれで十分と思われていたんでしょうね。