1. JavaScript / Говнокод #27300

    0

    1. 1
    2. 2
    3. 3
    // These are equivalent:
    fn`some string here`;
    fn(['some string here']);

    Джаваскриптеры переизобрели руби (ладно-ладно, скрестили с FormattableString из шарпа)

    https://styled-components.com/docs/advanced#tagged-template-literals

    Запостил: Fike, 16 Марта 2021

    Комментарии (13) RSS

    • Нет, тут даже шарп не нужен. Всё, ВСЁ это уже было в рубях, рельсах, sass, liquid.

      https://stackoverflow.com/q/29172251/2908793
      Ответить
    • а точно не printf изобрели?

      когда звезут perl qw или ruby %w -- разбудите
      Ответить
      • Ну это сахар для printf'а, да.

        fn`foo=$foo` это fn(['foo='], [foo]) вроде бы.
        Ответить
        • Прямо как fstrings в питоне, только там не $ как в фу-фу-фу пхп, а {} как в сишке, вроде даже выражения туда можно пропихнуть.
          Ответить
          • fstring'и менее универсальные, они сами подставляют. А здесь тебе просто куски прилетают, насколько я помню. И ты можешь с ними делать всё что хочешь.
            Ответить
            • Ага. Но багор в том, что интерполирууемые выражения всё равно выполнятся. `${2 + 2}` вернет не функцию, а 4.
              Ответить
              • Ну это не такой уж багор пока строка под контролем приложения, а не юзера.

                printf() в сишке тоже не особо безопасен если юзер будет рулить строкой формата.
                Ответить
                • По идее это передача управления интерполяцией под контроль приложения, типа вот тебе строка, которую надо отпроцессить, сам разбирай выражения. Но ты даже не можешь сделать из этого какой-нибудь l10n и заменять ${count} ${count | pluralize 'item'} на l10n.pluralize({noun: 'item', value: coun}), только ебаться с этим снаружи, а не изнутри.
                  Ответить
                  • В принципе могу: `${count} ${pluralize('item', count)}`

                    А, я понял о чём ты. Параметры никакие не прокинуть и контекст не прицепить чтобы выражения покороче писались.
                    Ответить
                    • ага, ну и свой dsl поудобней
                      Ответить
                      • Ну dsl хуй бы с ним, если бы можно было this забиндить на что-то своё и позвать формулу.

                        ${pluralize('item', count)} не так уж и ужасно смотрится.
                        Ответить
                      • А вообще, я так понял, они пытались вполне конкретную задачу решить: правильную экранировку во время интерполяции. Чтобы экранировать аргументы, но не трогать окружающую их строку. Вот только для этого оно и работает.
                        Ответить
              • А вообще через эту штуку можно даже что-то безопасное слепить:

                query`select * from test where name=${name}`

                Аргументы можно отправить через параметры запроса, не превращая их в строки. Даже экранировать ничего не придётся.

                С питоньими fstring'ами это невозможно, насколько я понимаю.
                Ответить

    Добавить комментарий