openlang

一元逗号到底做什么

我在读 Powershell in Action,看到 Chapter 5 的一段时卡住了。结果我能看懂,不过谁能解释一下这样做的用途和原因?

$nested = 4, (5, 6)
$flattened = $nested | foreach { $_ }

$flattened.length

这样 $flattened.length 是 3。可以理解。

$nested = 4, (5, 6)
$flattened = $nested | foreach { ,$_ }

$flattened.length

这次 $flattened.length 得到 2。

运行 $flattened[0]; $flattened[1] -join "," 能看出那 2 个对象是什么,但第二个 ForEach 里的逗号究竟做了什么?

大概是在说,“把 4 留作一个对象,把 (5,6) 也留作单独的对象。别拆开它们。”吗?

从英语翻译查看原文

后续讨论 3

顺着彼此的依据读下去
  1. 固定链接

    Powershell 管道会为了方便用户和所谓的“一致性”(说来有点好笑)而“展开”集合。一元运算符会阻止 powershell 做这个展开。那些例子不太理想,我换个方式试试。

    看看下面两个片段的输出

    (4, 5, 6) | ForEach-Object {
        Write-Host "Pipeline element now: $_"
    }
    
    Pipeline element now: 4
    Pipeline element now: 5
    Pipeline element now: 6
    ,(4, 5, 6) | ForEach-Object {
        Write-Host "Pipeline element now: $_"
    }
    
    Pipeline element now: 4 5 6

    后一个把整个集合作为单个对象传递,所以不会被展开。它其实是数组,显示空格而不是逗号,是因为默认输出字段分隔符是空格(保存在 $ofs 中)。可以这样观察

    "$(4, 5, 6)"
    
    4 5 6

    把数组放进字符串后,powershell 会用默认 OFS 连接它的元素。可以改,只是很少需要。

    $ofs = '/~/'
    
    "$(4, 5, 6)"
    
    4/~/5/~/6

    我自己经常用这个一元运算符的一种情况,就是拆分值之后,仍然想把所有元素放在一个对象里一起传递。

    ,(-split 'Tavin enjoys powershell') | ForEach-Object {
        [PSCustomObject]@{
            Who   = $_[0]
            Does  = $_[1]
            Topic = $_[2]
        }
    }
    
    Who   Does   Topic
    ---   ----   -----
    Tavin enjoys powershell
    从英语翻译查看原文

同一个问题的其他角度

  1. 在 Godot 3.3 的 GDScript 中怎样随机选择枚举项而不用逐项列出?

    这是我在 GDScript 中使用的枚举声明。 我想随机选择一个枚举变体,而不用列出所有可能的变体。这样以后增加变体时,就不必修改负责随机选择的代码。 我尝试过下面这种方法。 还有这一种。 两种都失败了。一个返回 Null,另一个报告 "Invali…

    回复 2最近活动 gdscript
  2. Nim 求余语法

    Nim 中怎样表示求余运算? cell % 7 == 0 会给出 undeclared identifier: '%' 这个错误 Google 搜索和查看 SO 都没找到答案。

    回复 2最近活动 nim
  3. 从 APL 函数返回结果

    怎样才能让函数在执行结束后返回一个值? 例如我有这样的代码。 ROUTINE N ? N ⍴ 12 //它会生成 N 个从 1 到 12 的随机值 (N 是函数的参数)。 我只是想知道怎样拿到函数的结果,然后比如把这个结果传给另一个函数。 谢谢大家的…

    回复 2最近活动 apl