Nano Hash - криптовалюты, майнинг, программирование

Возможно ли иметь комментарий внутри строки шаблона es6?

Допустим, у нас есть многострочная строка шаблона es6 для описания, например. некоторые параметры URL для запроса:

const fields = `
    id,
    message,
    created_time,
    permalink_url,
    type
`;

Есть ли способ иметь комментарии внутри этой строки Template-String? Нравиться:

const fields = `
    // post id
    id,
    // post status/message
    message,
    // .....
    created_time,
    permalink_url,
    type
`;

Ответы:


1

No.

Этот синтаксис действителен, но он просто вернет строку, содержащую \n// post id\nid, а не удалит комментарии и не создаст строку без них.

Если вы посмотрите на §11.8.6 спецификации вы можете видеть, что единственный токен, распознаваемый между разделителями обратных апострофов, — это TemplateCharacters, который принимает escape-последовательности, разрывы строк и обычные символы. В §A.1 SourceCharacter определяется как любая точка Unicode (кроме исключенных в 11.8.6).

14.10.2016

2

Вариант 1. Интерполяция

Мы можем создать блоки interpolation, которые возвращают пустой string и вставлять в них комментарии.

const fields = `
  id,${ /* post id */'' }
  message,${ /* post status/message */'' }
  created_time,
  permalink_url,
  type
`;

console.log(fields);

Вариант 2. Шаблоны с тегами

Используя шаблоны с тегами, мы можем очистить комментарии и восстановить струны. Вот простая функция commented, которая использует Array.map(), String.replace() и выражение регулярного выражения (которое требует некоторой работы), чтобы очистить комментарии и вернуть чистую строку:

const commented = (strings, ...values) => {
  const pattern = /\/{2}.+$/gm; // basic idea

  return strings
    .map((str, i) => 
      `${str}${values[i] !== undefined ? values[i] : ''}`)
    .join('')
    .replace(pattern, '');
};

const d = 10;
const fields = commented`
  ${d}
  id, // post ID
  ${d}
  message, // post/status message
  created_time, // ...
  permalink_uri,
  type
`;

console.log(fields);

14.10.2016

3

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

Можно ли использовать комментарии в литеральных строках шаблона?

Да. Да, ты можешь. Но это некрасиво.

const fields = `
    id, ${/* post ID */''}
    message, ${/* post/status message */''}
    created_time, ${/*... */''}
    permalink_url,
    type
`;

Обратите внимание, что вы должны поместить '' (пустую строку) в скобки ${ } , чтобы у Javascript было выражение для вставки. Если этого не сделать, возникнет ошибка времени выполнения. Кавычки могут быть в любом месте за пределами комментария.

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

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

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

.

Теперь, чтобы ответить на цель вопроса:

Как написать строку списка, разделенную запятыми, с комментариями в каждой строке?

const fields = [
    "id", // post ID
    "message", // post/status message
    "created_time", //...
    "permalink_url",
    "type"
].join(",\n");

Присоединение к массиву - это один из способов... (как предложил @jared-smith)

Однако в этом случае вы создаете массив, а затем сразу же отбрасываете организованные данные, когда вы только назначаете возвращаемое значение функции join(). Мало того, вы создаете указатель памяти для каждой строки в массиве, который не будет собирать мусор до конца области. В этом случае может быть полезнее захватить массив, объединяясь на лету, как того требует использование, или использовать литерал шаблона и по-разному комментировать свою реализацию, например, в стиле ghostDoc.

Кажется, что вы используете литералы шаблонов только для того, чтобы удовлетворить желание не иметь кавычек в каждой строке, сводя к минимуму когнитивный диссонанс между «строковыми» параметрами запроса, когда они выглядят в URL-адресе и коде. Вы должны знать, что это сохраняет разрывы строк, и я сомневаюсь, что вы этого хотите. Вместо этого рассмотрим:

/****************
 * Fields:
 *   id : post ID
 *   message : post/status message
 *   created_time : some other comment...
 */
const fields = `
    id,
    message,
    created_time,
    permalink_uri,
    type
`.replace(/\s/g,'');

Это использует регулярное выражение для фильтрации всех пробелов, сохраняя при этом список читаемым и перестраиваемым. Все, что делает литерал регулярного выражения, — это захват пробела, а затем метод replace заменяет захваченный текст на '' (g в конце просто говорит регулярному выражению не останавливаться на первом найденном совпадении, в данном случае на первом символе новой строки. )

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

const fields = `
    id, // post ID
    message, // post/status message
    created_time, // ...
    permalink_uri,
    type
`.replace(/\s+\/\/.*\*\/\n/g,'').replace(/\s/g,'');

Это первое регулярное выражение найдет и заменит пустой строкой ('') все экземпляры: одного или нескольких пробельных символов, предшествующих двойной косой черте (каждая косая черта экранируется обратной косой чертой), за которыми следует пробел и символ новой строки. Если вы хотите использовать комментарии /* multiline */, это регулярное выражение станет немного сложнее, вам придется добавить еще одно .replace() в конце:

.replace(/\/\*.*\*\//g,'')

Это регулярное выражение может работать только после того, как вы удалите \n новых строк, иначе регулярное выражение не будет соответствовать комментарию «теперь не многострочный». Это будет выглядеть примерно так:

const fields = `
    id, // post ID
    message, /* post/
                status message */
    created_time, // ...
    permalink_uri,
    type
`.replace(/\s+\/\/.*\n/g,'').replace(/\s/g,'').replace(/\/\*.*\*\//g,'');

Все вышеперечисленное приведет к этой строке:

"id,message,created_time,permalink_uri,type"

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

Я постараюсь узнать об этом позже на https://jsperf.com/. Мне сейчас очень любопытно!

31.01.2018

4

Просто не используйте строки шаблона:

const fields = [
    'id',  // comment blah blah
    'message',
    'created_time',
    'permalink_url',
    'type'
].join(',');

Вы оплачиваете стоимость вызова массива и метода при инициализации (при условии, что JIT недостаточно умен, чтобы полностью его оптимизировать.

Как указывает ssube, результирующая строка не будет содержать разрывов строк или пробелов. Это зависит от того, насколько это важно, вы можете вручную добавить ' ' и '\n', если это необходимо, или решить, что вам действительно не нужны встроенные комментарии.

ОБНОВИТЬ

Обратите внимание, что хранение программных данных в строках обычно считается плохой идеей: вместо этого сохраните их как именованные переменные или свойства объекта. Поскольку ваш комментарий отражает, что вы просто конвертируете кучу вещей в строку запроса URL:

const makeQueryString = (url, data) => {
  return url + '?' + Object.keys(data)
    .map(k => `${k}=${encodeURIComponent(data[k))})
    .join('&');
};

let qs = makeQueryString(url, {
  id: 3,
  message: 'blah blah',
  // etc.
});

Теперь у вас есть вещи, которые легче изменить, понять, использовать повторно и которые более прозрачны для инструментов анализа кода (например, в выбранной вами среде IDE).

14.10.2016
  • В результате получается совсем другая строка, поскольку она не содержит разрывов строк или пробелов. 14.10.2016
  • Да, я тоже имел это в виду как запасной вариант. И удаленные разрывы строк/пробелы (в моем случае) нужны, поэтому, думаю, мне придется пойти с этим решением. Просто интересовался, возможно ли это как-то. 14.10.2016
  • В моем случае речь идет не о хранении данных, а о запросе Graph API, который выглядит примерно так: /page-id/posts?fields=id,message,created_time,...,...,...,. ..&limit=100&since=... И я не хочу хранить значения полей в одной длинной нечитаемой строке. 14.10.2016
  • @lukash обновил ответ, чтобы отразить рассматриваемый вариант использования. 14.10.2016
  • @JaredSmith Спасибо, но я думаю, вы меня неправильно поняли. URL-адрес выглядит не как ?id=3&message=blahblah..., а как: ?fields=id,message,created_time,type&otherstuff=1 И я не хочу иметь одну длинную строку имен полей. 14.10.2016
  • Или вы можете присоединиться к ',\n', что фактически даст вам строку, которую вы искали в первую очередь. Честно говоря, это, хотя и незначительно, более затратно, чем просто использование строк шаблона, поскольку строки шаблона оптимизируются JIT-компилятором и не требуют использования вложенных методов JS или ненужного выделения памяти. Я только что сам написал аналогичную функцию makeQueryString, но в этом случае ни одна из наших функций не подходит для запроса OP, поскольку сгенерированный параметр представляет собой список с разделителями-запятыми, а не отдельные параметры. 31.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование