为什么_不能在字符串插值中使用?

Eri*_*lun 15 lambda scala string-interpolation

这有效

(x => s"$x")
Run Code Online (Sandbox Code Playgroud)

但是这个

(s"${_}")
Run Code Online (Sandbox Code Playgroud)

[error] ...: unbound placeholder parameter
[error]   (s"${_}")
Run Code Online (Sandbox Code Playgroud)

这只是因为该(s"$_")构造遭受漏洞抽象

此外: (s"$_")输出完全不同:

[error] ...: invalid string interpolation: `$$', `$'ident or `$'BlockExpr expected
[error]   (s"$_")
[error]      ^
[error] ...: unclosed string literal
[error]   (s"$_")
Run Code Online (Sandbox Code Playgroud)

kir*_*uku 5

在我看来,调用字符串插值漏洞是完全正确的.虽然它在大多数情况下都能正常工作,但是有许多边缘情况,它只是不按预期方式工作.这是另一个这种边缘情况的化身.

我不知道s"$_"编译器为什么不接受.前段时间有一个pull请求为模式匹配引入了这种语法:PR 2823

有趣的是,这个PR还包含测试用例,用于测试模式匹配之外下划线是否会产生错误.

不幸的是,没有进一步的描述为什么这是以它的实现方式实现的.

Som Snytt,实施PR的人在SO上很活跃,希望他能说得更多.

  • @som-snytt:ping,因为ping中的答案不起作用. (3认同)
  • 我不知道为什么 ping 评论不起作用。s"$_" 的 PR 是 https://github.com/scala/scala/pull/2793,你可以在那里阅读到冷脚。这个功能有历史,我认为它真的很简洁。很抱歉人们对 _ 和 function lits 感到困惑,但这就是 SO 的用途。我想要 ss map s"text $_" 好几次了。 (2认同)
  • 我认为 `s"$_"` 会使语言变得更复杂的推理是不合理的......事实上 `_` 当前在你期望它工作的地方不能统一工作是复杂性的。 (2认同)