PowerShell 로 다음과 같은 코드를 실행하면 어떤 값이 나올까?
# 샘플 1
function f1
{
$a = New-Object System.Collections.ArrayList
$a.Add(1)
$a.Add(2)
return $a
}
$ret = f
$ret.getType().fullname
$ret
ArrayList를 return 했으니 다음과 같이 나올 것이라고 기대했다.
System.Collections.ArrayList
1
2
하지만 실제 나오는 값은 다음과 같다.
System.Object[]
0
1
1
2
알고 보니 powershell 의 return 은 생각하던 것과 다르게 동작하고 있었다.
다음 코드는
return $a
사실 다음과 같이 동작한다는 것
$a
return
그리고 return으로 넘어오는 값은 중간에 output으로 내보낸 값이 다 넘어 오더라는
# 샘플 2
function f2
{
$a = 1
$b = 2
$c = 3
$a
$b
$c
return $c
}
$ret = f2
$ret.getType().fullname
$ret
# 결과
System.Object[]
1
2
3
3
위와 같이 $a, $b, $c, $c 식으로 output으로 나간 결과가 return 되어서 처리되더라능 :(
샘플 1의 문제가 되는 부분은
System.Collections.ArrayList.Add 이 value가 add된 index를 return 해서 문제였다능.
Object 그대로 return 되기를 원한다면 다음과 같이 수정하면 되는 듯
# 샘플 1 수정
function f1
{
$a = New-Object System.Collections.ArrayList
[void]$a.Add(1) # ouput 제거
[void]$a.Add(2) # output 제거
,$a # Object 그대로 return 하도록
}
$ret = f
$ret.getType().fullname
$ret
# 결과
System.Collections.ArrayList
1
2
[ 참고 ]
Effective PowerShell Item 7: Understanding "Output"
Effective PowerShell Item 8: Output Cardinality - Scalars, Collections and Empty Sets - Oh My!