PowerShell:不能在类方法中使用局部变量?

lf3rwulv  于 2023-05-22  发布在  Shell
关注(0)|答案(2)|浏览(153)

我希望在类方法内部,我可以在方法内部设置“局部”变量的作用域,但事实并非如此。以下是测试代码:

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下进行了测试。

rdlzhqv9

rdlzhqv91#

这是令人惊讶的。我怎么能有局部变量?
你可以在一个类方法中拥有所有你想要的局部变量- *,只要它们的名字不与任何类成员的名字冲突 *:

class MyClass
{
  [string]$var

  MyMethod()
  {
    $somethingOtherThanVar = "this should work"
  }
}

PowerShell抛出这个错误的原因是为了“有帮助”--一个新的语言或类定义功能的类作者可能会在一个方法中分配给$var,认为$this.var(在方法体外部声明为$var)会反映这个分配,并会有一个令人讨厌的惊喜。

bwleehnv

bwleehnv2#

公认的答案避免了问题,但没有确定其根本原因。变量的作用域必须始终在类函数中指定,函数接收的参数和类属性除外。所以你可以写没有任何问题:

class test_scope {
    $var = "class var"

    test_scope() {
    }

    [void] my_method() {
        $local:var = "local method var" # or private
        $script:var = "script var"      # or global

        # one can omit local or private scope when reading the variable:
        Write-Host "'$var' vs '$( $this.var )'"

        # one has to use global or script scope also when reading the variable:
        Write-Host "'$( $script:var )' vs '$( $this.var )'" # or global
    }
}

$obj = [test_scope]::new()
$obj.my_method()

输出:

'local method var' vs 'class var'
'script var' vs 'class var'

相关问题