LINUX.ORG.RU

Строки в Swift

 ,


0

1

Читаю книжку по Swift. Язык так себе, но есть одна фишка, которую я не могу понять. Язык компилируемый, но строки позволяют делать такое:

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"

И похоже можно в скобках писать [почти] любые функции и конструкции языка.

Вопрос: как это работает?

★★★★

Ответ на: комментарий от ddos3

Странно очень для компилируемого языка. У них основная фишка - строгая статическая типизация и поиск как можно большего числа ошибок на этапе компиляции.

А тут можно написать выражение с кривыми типами и получить ошибку во время выполнения. Да и делать VM только для этого...

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

Ок, ты меня раскусил: там нет вм. Просто компайлер превращает твою стоку в

let message = multiplier.toString() + "times 2.5 is " + (Double(multiplie r) * 2.5).toString()

ddos3
()
Ответ на: комментарий от ddos3

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

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

Это преобразуется в snprintf с выносом () в %s параметры, достаточно очевидно и без доков, не?

anonymous
()
Ответ на: комментарий от alexru

Если это будет работать в рантайме, то язык точно будет не нужен.

Сильно сомневаюсь, что в современном языке возможна дыра в виде «бесплатного» eval.

amm
()
Последнее исправление: amm (всего исправлений: 1)

А как строковая интерполяция связана с компилируемостью языка? Это синтаксический сахар. Инструкции, которые ты выполняешь для формирования строки ты знаешь заранее. Никакого eval'а тут нет.

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

А если строка формируется в одном месте, а используется в другом. Или одна и та же строка используется в двух разных контекстах и в них обоих существует такая переменная? А если строка формируется динамически из кусков или пользовательского ввода?

На все эти вопросы в доке на язык я не смог найти ответа.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

На все эти вопросы в доке на язык я не смог найти ответа.

дык возьми да попробуй

vvviperrr ★★★★★
()
Ответ на: комментарий от alexru

Дык, проверить быстрее, или 100 уе жалко? (по диагонали новость читал). А, компилируемость, ортогональна: nemerle вроде что-то такое умеет, rust тоже (правда явный format!), template haskell также позволяет.

anonymous
()
Ответ на: комментарий от alexru

Очень похоже, что это просто синтаксический сахар. Точно так же как и «\n» это не строка из двух символов '\' и 'n', а Line Feed. Содержимое определяется на этапе компиляции. Если переменной multiplier не окажется или она не может сконвертироваться в строку будет ошибка компиляции. Надёжнее взять да проверить.

Dendy ★★★★★
()

начнём с того что в твоем примере компилер может вообще твою строку просчитать на этапе компиляции и вся твоя программа просто print «статическая строка»

anonymous
()
Ответ на: комментарий от anonymous

Дык, проверить быстрее, или 100 уе жалко?

А макбук мне местные модераторы подарят?

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

А если строка формируется в одном месте, а используется в другом

Работать не будет, по идее такая фишка работает только со строковами литералами.

Или одна и та же строка используется в двух разных контекстах и в них обоих существует такая переменная?

Не может такого быть, может быть так: две одинаковые строки используются в двух разных контекстах и т. д.

А если строка формируется динамически из кусков или пользовательского ввода?

Работать не будет, см. выше.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Работать не будет, см. выше.

Ну я примерно могу догадаться, что магии не бывает. Почему все это не описано в документации? Это единственное за что цепляется глаз, в остальном в этом языке нет вообще ничего особенного.

alexru ★★★★
() автор топика

Очевидно, синтаксический сахар для строк. Экономия на кавычках с конкатенацией за счёт скобок.

blexey ★★★★★
()
Ответ на: комментарий от theNamelessOne

тут

Есть еще то же самое в виде PDF, но я его на работе оставил и сейчас снова нагуглить не могу.

alexru ★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

Ну я вернулся к документации и увидел. Не зная этого названия - пропустил.

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

Сейчас вики почитал - действительно много где так можно.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

А если строка формируется в одном месте, а используется в другом. Или одна и та же строка используется в двух разных контекстах и в них обоих существует такая переменная? А если строка формируется динамически из кусков или пользовательского ввода?

Никакой разницы. Строковая интерполяция это просто такой сахар чтобы записать конкатенацию строк. Всё, никакой магии.

KblCb ★★★★★
()
Ответ на: комментарий от alexru

Почему все это не описано в документации

языку день, учитывая как любят разработчики писать документацию..

umren ★★★★★
()

Это даже в баше есть

anonymous
()

ЯП едва появился на свет, а глупые вопросы по нему на LOR уже тут, как тут.

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.