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

Это работает

(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, парень, который реализовал пиар, активен на SO, надеюсь, он сможет рассказать больше.

Другие вопросы по тегам