Por que a variável global é legível, mas não pode ser gravada dentro de uma função?

0

O script PowerShell a seguir produzirá A, B, A

$x = "A"

function scopetest()
{
    Write-Host $x;
    $x = 'B'
    Write-Host $x
}

scopetest

Write-Host $x

Agora a parte estranha:

O primeiro valor A é do escopo global - ele pode ser lido dentro da função, então obviamente a variável está presente. No entanto, se eu gravar na variável as-is, o valor B não será preservado fora da função.

Eu esperaria um desses dois resultados: [null], B, A ou A, B, B (o último é alcançado se eu escrever usando $ global: x = 'B' ).

Por que a variável global $ x é legível dentro da função, mas não gravável?

    
por mhbuur 21.10.2015 / 14:42

1 resposta

2

De link

An item that you created within a scope can be changed only in the scope in which it was created, unless you explicitly specify a different scope.

para que você possa usar $Global:x = ... para defini-lo.

Os scripts do Powershell geralmente são copiados e colados em blocos para implementar a funcionalidade, e geralmente os métodos são escritos para serem usados por vários scripts. Ao restringir a atribuição ao escopo de definição de uma variável, você garante que, mesmo se dois blocos de código colados usarem o mesmo nome de variável, eles não poderão alterar os dados de que o outro bloco depende, sem declarar explicitamente que desejam fazer isso. Isso ajuda a tornar os blocos mais modulares e ajuda a identificar colisões de nomes não intencionais.

Editar:

uma nota sobre o escopo do powershell: Escopos em cascata Powershell, de modo que o escopo local sempre contém objetos definidos em escopos ancestrais (pai, pai / mãe, global, etc). Isso significa que uma variável definida globalmente ou em um quadro de pilha pai (uma função que chama uma função) está sempre acessível, enquanto os objetos definidos em escopos filho não são. Nesse caso, a única restrição é que um escopo filho não pode modificar um valor de escopos pai, a menos que esse escopo seja definido explicitamente.

De: link

The following are the basic rules of scope:

    - An item you include in a scope is visible in the scope in which it 
      was created and in any child scope, unless you explicitly make it 
      private. You can place variables, aliases, functions, or Windows
      PowerShell drives in one or more scopes. 

    - An item that you created within a scope can be changed only in the 
      scope in which it was created, unless you explicitly specify a 
      different scope.


If you create an item in a scope, and the item shares its name with an
item in a different scope, the original item might be hidden under the
new item. But, it is not overridden or changed.
    
por 21.10.2015 / 14:53