在foreach循环再利用变量

问题描述:

意识到它可能它可能不是最好的做法,有没有其他的理由不重用在foreach当前项变量,例如:在foreach循环再利用变量

foreach ($a in $something) 
{Write-host $a} 
. 
. 
. 
foreach ($a in $somethingelse) 
{Write-host $a} 

换句话说,就是它始终在第二种情况下最好使用不同的变量($ b?)

没有什么问题。变量$a将始终设置为foreach循环体内的当前项目。

作为briantist提到这很好。但是,当我做一个foreach循环时,我倾向于保持它指定给你从中取得的任何东西。我觉得这样会更容易理解。

#Example 1 
foreach ($item in $array) 
{Write-Host $item} 

#Example 2 
foreach ($user in $userList) 
{Write-Host $user} 

#Example 3 
foreach ($breed in $dogBreed) 
{Write-Host $breed} 
+0

我同意这种说法。如果后续的'foreach'循环使用相同的实例变量是有意义的,那么我将在海报完成时重用它,如果没有意义,我将使用一个新名称。本质上,旨在提高可读性。 – briantist

+1

感谢您的澄清。在我的情况下,我从两个不同的计算机列表中拉出来,所以foreach($ list1中的$​​ computer)和foreach($ list2中的$ computer)对于正在使用的内容仍然有意义。 – Clizby

原因之一,这不是一个想法是,可变$a保留它的值(指定范围内),直到它被重新分配。这听起来可能不是什么大问题,但偶尔PowerShell会做出一些意想不到的事情,但仅仅通过排除故障来解决问题就不值得。考虑这个function

function reuse-vars { 

$arrayA = 0..3 
$arrayB = 10..13 
$arrayC = 20..23 

    foreach ($a in $arrayA){ 
     Write-Host "`$a is $a" 
     Write-Host "`$b is $b" 
     Write-Host "`$c is $c" 
    } 

    foreach ($b in $arrayB){ 
     Write-Host "`$a is $a" 
     Write-Host "`$b is $b" 
     Write-Host "`$c is $c" 
    } 

    foreach ($c in $arrayC){ 
     Write-Host "`$a is $a" 
     Write-Host "`$b is $b" 
     Write-Host "`$c is $c" 
    } 

} 

$a会从最后一个foreach迭代保留值,直到它被重新分配,内嵌套foreach包括或者如果他们在系列。

C:\> reuse-vars 
$a is 0 
$b is 
$c is 
$a is 1 
$b is 
$c is 
$a is 2 
$b is 
$c is 
$a is 3 
$b is 
$c is 
$a is 3 
$b is 10 
$c is 
$a is 3 
$b is 11 
$c is 
$a is 3 
$b is 12 
$c is 
$a is 3 
$b is 13 
$c is 
$a is 3 
$b is 13 
$c is 20 
$a is 3 
$b is 13 
$c is 21 
$a is 3 
$b is 13 
$c is 22 
$a is 3 
$b is 13 
$c is 23 

它可能不是取决于你在做什么,但对于这导致的问题可能使它值得梦想每个foreach(如$b)不同的变量名没关系。

+0

我不认为这与其他任何保留其价值的变量不同。这也不是真正解决问题中提出的情况。 – briantist

我同意其他人认为这应该很好,但使用不同的名字是更好的做法。

不过,如果你是偏执狂,你可以随时清除或手动删除环路之间的变量:

foreach ($a in $something) 
{Write-host $a} 
. 
$a = $null; 
. 
foreach ($a in $somethingelse) 
{Write-host $a} 

或者:

foreach ($a in $something) 
{Write-host $a} 
. 
Remove-Variable -Name a; 
. 
foreach ($a in $somethingelse) 
{Write-host $a}