gpt4 book ai didi

powershell - 在Powershell中为索引的迭代表进行鸭子类型(duck typing)

转载 作者:行者123 更新时间:2023-12-02 23:55:25 24 4
gpt4 key购买 nike

代替遍历集合,有时在过程上循环遍历它们更方便。为了避免根据输入区分$_$_.Key / $_.Value,更一致的键/值处理将是不错的:

ForEach-KV $object { Param($k, $v); do-stuff }

但是,普通类型的探测有其缺点:
#-- iterate over dicts/objects/arrays using scriptblock with Param($k,$v)
function ForEach-KV {
Param($var, $cb, $i=0)
switch ($var.GetType().Name) {
Array { $var | % { $cb.Invoke($i++, $_) } }
HashTable { $var.Keys | % { $cb.Invoke($_, $var[$_]) } }
"Dictionary``2" { $var.Keys | % { $cb.Invoke($_, $var.Item($_)) } }
PSobject { $var.GetIterator() | % { $cb.Invoke($_.Key, $_.Value) } }
PSCustomObject { $var.GetIterator() | % { $cb.Invoke($_.Key, $_.Value) } }
default { $cb.Invoke($i++, $_) }
}
}

除了那种令人讨厌的类型名称之外,这里还有很多重复之处。这就是为什么我一直在寻找在Powershell中键入鸭子的原因。

对于散列和对象,探测 .getIterator.getEnumerator(最根本不记得哪个属于哪个)是最简单/显而易见的:
switch ($_) {
{ $_.GetEnumerator } { do-loopy }
{ $_.GetIterator } { do-otherloopy }

但是现在我不确定在这里如何处理数组。在 [array]的方法中,并没有真正出现一个 行为指示器。
  • .Get()看起来确实很独特(至少不是HashTables或PSObjects中的方法),但听起来有点过于通用,即使对于类型猜测
  • .Add()可能也是整数方法(?)
  • .GetUpperBound()等已经太具体了。

  • 因此,是否有一个标准的方法说“数组化”,最好是在其他数字索引的值集合之间共享?

    最佳答案

    如果只想匹配数组:

    PS> $x = 1..10
    PS> $x.GetType().IsArray
    True

    或者您可以检查是否存在整数索引器:
    (Get-Member -InputObject $x -Name 'Item' -MemberType 'ParameterizedProperty').Definition -match '\(int index\)'

    关于powershell - 在Powershell中为索引的迭代表进行鸭子类型(duck typing),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46000350/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com