除非我将结果设置为可变变量,否则Nushell表更新将起作用

Nushell table update works unless I set the result to a mutable variable

提问人:neurodynamic 提问时间:10/10/2023 最后编辑:Peter Mortensenneurodynamic 更新时间:10/12/2023 访问量:68

问:

这段代码运行得很完美:

    $table | update col { |row| "some value" } | print

这段代码也能完美运行:

    let $final_table = $table | update col { |row| "some value" }
    $final_table | print

此代码在调用 时抛出错误:Command does not support nothingupdate

    $table = $table | update col { |row| "some value" }
    $table | print

上一个的唯一区别是设置了(可变变量),而不是新创建的变量或直接流水线到命令。为什么这会对这段代码产生影响,无论是否出错?$tableprint

可变的 NUSHELL

评论


答:

2赞 pmf 10/10/2023 #1

从 Nushell 0.83 开始,声明关键字(如 and)不再需要使用子表达式将管道的输出分配给变量(参见博客)。letmut

但是,将管道的输出分配给可变变量(在本例中执行的操作)是此语言改进的有意例外。为此,您仍然需要使用子表达式:

$table = ($table | update col "some value")

请注意,我还在此处简化了您的命令,因为它仅包含一个静态值。update

考虑到语言的改进,这也可以使用 or 关键字来完成。例如:letmut

let $final_table = $table | update col { |row| "some value" }

mut $table = $table | update col { |row| "some value" }

但是,重新声明(隐藏)同一变量并不是一个好的做法。最好继续使用子表达式来实现此目的,如上面的第一个示例所示。

评论

0赞 neurodynamic 10/11/2023
这奏效了;谢谢!这些情况之间的优先顺序会有所不同,这似乎很奇怪;你知道这是否是预期行为与错误吗?
1赞 pmf 10/11/2023
@neurodynamic我已经更新了我的答案以反映这一点。
0赞 NotTheDr01ds 10/12/2023
我很欣赏这种变化,但在这种情况下,它确实时不时地咬我。我仍在尝试决定是否在所有情况下继续使用子表达式更好,以避免必须单独处理不同的用例。现在,我的代码是“使用带有 and 的子表达式”的混合体,反之亦然。我想我倾向于在每种情况下继续使用子表达式——我不太确定语法糖是否值得额外的认知带宽,但我还没有完全决定:-)letmut
0赞 pmf 10/12/2023
如果我可以添加我的 2¢ 作为非开发人员:语法(尤其是语法糖)应该始终是直观的,即与其他语言设计决策具有很强的一致性,或者打破它的好处应该明显超过出现的问题。恕我直言,这个问题(遇到的)显然是一个范围/优先级问题,但将其追溯到实际导致它的“语言改进”根本不直观。因此,从它的好处来看,这取决于 Nu 在多大程度上试图吸引/容纳来自具有明确声明行的面向行/命令式语言的用户。