PowerShell:不能将局部变量限定在 class 方法内?
PowerShell: Cannot have local variables scoped inside a class method?
我希望在 class 方法内部,我可以在方法内部设置“本地”变量范围,但事实并非如此。以下是测试代码:
class test_scope {
$var = "class var"
test_scope() {
}
[void] my_method() {
$var = "method var"
}
}
$obj = [test_scope]::new()
$obj.my_method()
我收到一条错误消息:
Line |
8 | $var = "method var"
| ~~~~
| Cannot assign property, use '$this.var'.
这令人惊讶。我怎样才能拥有局部变量?
作为比较,函数(在 class 之外)可以具有与脚本变量同名的局部变量。下面是一个例子:
$var2="global var"
function my_function() {
$var2="function var"
write-host $var2
write-host $script:var2
}
my_function($null)
我得到了预期的答案:
function var
global var
与Python的另一个比较:
class test_scope:
var = "class var"
def my_method(self):
var = "method var"
print(self.var)
print(var)
obj = test_scope()
obj.my_method()
它按预期工作:
function var
global var
所以 PowerShell 不正常?
PS: 我在 PowerShell 5.0 和 7.0 下测试过。
This is surprising. How can I have local variables?
您可以在 class 方法中拥有所有您想要的局部变量 - 只要它们的名称不与任何 class 成员名称冲突:
class MyClass
{
[string]$var
MyMethod()
{
$somethingOtherThanVar = "this should work"
}
}
PowerShell 抛出错误的 原因 是为了 提供帮助 - class 作者的新手语言或 class 定义功能可能会在方法中分配给 $var
,认为 $this.var
(在方法主体外声明为 $var
)会反映分配并在一个令人讨厌的惊喜。
我希望在 class 方法内部,我可以在方法内部设置“本地”变量范围,但事实并非如此。以下是测试代码:
class test_scope {
$var = "class var"
test_scope() {
}
[void] my_method() {
$var = "method var"
}
}
$obj = [test_scope]::new()
$obj.my_method()
我收到一条错误消息:
Line |
8 | $var = "method var"
| ~~~~
| Cannot assign property, use '$this.var'.
这令人惊讶。我怎样才能拥有局部变量?
作为比较,函数(在 class 之外)可以具有与脚本变量同名的局部变量。下面是一个例子:
$var2="global var"
function my_function() {
$var2="function var"
write-host $var2
write-host $script:var2
}
my_function($null)
我得到了预期的答案:
function var
global var
与Python的另一个比较:
class test_scope:
var = "class var"
def my_method(self):
var = "method var"
print(self.var)
print(var)
obj = test_scope()
obj.my_method()
它按预期工作:
function var
global var
所以 PowerShell 不正常?
PS: 我在 PowerShell 5.0 和 7.0 下测试过。
This is surprising. How can I have local variables?
您可以在 class 方法中拥有所有您想要的局部变量 - 只要它们的名称不与任何 class 成员名称冲突:
class MyClass
{
[string]$var
MyMethod()
{
$somethingOtherThanVar = "this should work"
}
}
PowerShell 抛出错误的 原因 是为了 提供帮助 - class 作者的新手语言或 class 定义功能可能会在方法中分配给 $var
,认为 $this.var
(在方法主体外声明为 $var
)会反映分配并在一个令人讨厌的惊喜。