2013-11-10 3 views
11

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

(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"$_") 

ответ

5

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

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

Интересно, что этот PR также содержит тестовые примеры, которые проверяют, что underscore outside of a pattern match produces an error.

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

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

+3

@ som-snytt: ping, потому что пинг в ответе не работает. – sschaef

+0

Спасибо, и с нетерпением жду его комментария, тогда :) btw Я думаю, что '_' в сопоставлении с образцом и' _' в синтаксисе лямбда-функции - это две разные вещи, но тем не менее хорошо знать, что она работает в соответствии с шаблоном! –

+0

также с ошибкой btw '' $ _ "' с другой ошибкой, чем 's '$ {_}" '. –

Смежные вопросы