我希望在类方法内部,我可以在方法内部设置“局部”变量的作用域,但事实并非如此。以下是测试代码:
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'.
这是令人惊讶的。我怎么能有局部变量?
作为比较,函数(即类外部)可以具有与脚本变量同名的局部变量。下面是一个例子:
$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下进行了测试。
2条答案
按热度按时间rdlzhqv91#
这是令人惊讶的。我怎么能有局部变量?
你可以在一个类方法中拥有所有你想要的局部变量- *,只要它们的名字不与任何类成员的名字冲突 *:
PowerShell抛出这个错误的原因是为了“有帮助”--一个新的语言或类定义功能的类作者可能会在一个方法中分配给
$var
,认为$this.var
(在方法体外部声明为$var
)会反映这个分配,并会有一个令人讨厌的惊喜。bwleehnv2#
公认的答案避免了问题,但没有确定其根本原因。变量的作用域必须始终在类函数中指定,函数接收的参数和类属性除外。所以你可以写没有任何问题:
输出: