Почему нельзя использовать внутри интерполяции строк?

Это работает

(x => s"$x")

но этот

(s"${_}")

дает

[error] ...: unbound placeholder parameter
[error]   (s"${_}")

Это только потому, что конструкция s"..." страдает от Leaky Abstraction?

Кроме того: (s"$_") выходит из строя с совершенно другим выходом:

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

Ответ 1

Вызывающая строковая интерполяция - это, по-моему, абсолютно абстракция. Хотя в большинстве случаев он отлично работает, есть много краевых случаев, когда он просто не работает так, как этого можно ожидать. Это еще одно воплощение такого краевого случая.

Я не знаю, почему s"$_" не принимается компилятором. Некоторое время назад был запрос на растяжение, который представил этот синтаксис для сопоставления шаблонов: PR 2823

Интересно, что этот PR также содержит тестовые примеры, которые проверяют, что подчеркивание вне соответствия шаблону вызывает ошибку.

К сожалению, нет дальнейшего описания, почему это реализовано так, как оно реализовано.

Som Snytt, парень, который реализовал PR, активен на SO, надеюсь, что он сможет рассказать больше.