在 for 循环中优雅的编写方式?

VZ.*_*VZ. 11 raku

我可以写这样的东西(elem这是一个XML::Element,但这并不重要):

for $elem.nodes {
    when XML::Element { ... }
    when XML::Text { ... }
    ...
    default { note qq{Ignoring unknown XML node "$_".} }
}
Run Code Online (Sandbox Code Playgroud)

$_看起来不错,但没有给我使用它的代码内部的可读名称,这就是为什么我更喜欢这样写:

for $elem.nodes -> $child {
    when XML::Element { ... }
    when XML::Text { ... }
    ...
    default { note qq{Ignoring unknown XML node "$child".} }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为现在还$_没有设置,所以我实际上需要写

for $elem.nodes -> $child {
    given $child {
        when XML::Element { ... }
        when XML::Text { ... }
        ...
        default { note qq{Ignoring unknown XML node "$child".} }
    }
}
Run Code Online (Sandbox Code Playgroud)

这有点多余,并且增加了额外的缩进级别。

这绝对不是世界末日,但我是否缺少一些简单的方法来获得可读的变量名并避免given

Raw*_*ler 9

您可以将变量绑定在when语句上方,它有点难看,但它可以完成工作。

for $elem.nodes {
    my $child = $_;
    when XML::Element { say 'I am XML!' }
    when XML::Text { say 'I am text!' }
    default { say "I am default: $child" }
}
Run Code Online (Sandbox Code Playgroud)

编辑:在 Raku 中,我认为坚持使用$_“观看”是完全合理的,因为“观看”的想法$_已经存在相当长一段时间了。

  • 这应该是 ```$child := $_;``` 吗? (2认同)
  • @p6steve 可以,但在这种情况下应该不会有什么不同。 (2认同)
  • 谢谢,我想这确实是最合理的答案,我只是希望可能有某种神奇的方法可以以某种方式将 `$child` 和 `$_` 同时绑定到循环值 - 但如果没有,这是做我想做的事情的最清晰、最简洁的方式。 (2认同)

p6s*_*eve 8

for @a -> $x { { 
    when 2 { say "$x ... a" }
    when 4 { say "$x ... b" }
} given $x }
Run Code Online (Sandbox Code Playgroud)

顽皮的双卷发和后发?

  • 感谢您的想法,很高兴知道它有效,但我不想在代码审查中捍卫这一点...... (2认同)