Строка формата Ruby с переменной внутри кавычек - PullRequest
0 голосов
/ 30 августа 2018

Если я делаю

template_string = "class=btn submit-button %<additional_classes>"
format(template_string, additional_classes: 'some-class')

это работает. Однако, если я сделаю

template_string = "class='btn submit-button %<additional_classes>'"
format(template_string, additional_classes: 'some-class')

терпит неудачу, давая

ArgumentError:
  malformed format string - %'

(Обратите внимание на кавычки, окружающие классы во второй строке template_string - это единственное различие между двумя блоками кода Ruby). Как мне заставить это работать? Другими словами, как мне произвести следующее?

class = 'btn submit-button some-class'

Я не верю, что могу просто использовать интерполяцию, потому что иногда мне нужно передавать другие переменные. Другими словами, я не могу сделать

additional_classes = 'some-class'
"class='btn submit-button #{additional_classes}'"

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

class = 'btn submit-button some-other-class'

или

class = 'кнопка отправки некоего третьего класса'

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

В строке формата отсутствует спецификатор типа поля . Указатель типа поля является обязательным в строке формата.

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

Однако мне не понятно, почему вы считаете этот пример работоспособным:

template_string = "class=btn submit-button %<additional_classes>"
format(template_string, additional_classes: 'some-class')
#=> 'class=btn submit-button %'
#                            ↑

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

Во втором примере вы можете ясно увидеть проблему:

ArgumentError: malformed format string - %'
                                          ↑

Поскольку строка формата должна иметь спецификатор типа поля, а единственным символом после % (кроме имени поля) является ', это интерпретируется как спецификатор типа поля. А поскольку ' не является допустимым типом поля, format вызывает ошибку, в которой он явно сообщает, что интерпретировал ' как часть строки формата.

Поскольку вы хотите форматировать строки, вы должны использовать спецификатор типа поля s (string):

template_string = "class=btn 'submit-button %<additional_classes>s'"
#                                                                ↑

format(template_string, additional_classes: 'some-class')
#=> "class=btn 'submit-button some-class'"
#                             ↑↑↑↑↑↑↑↑↑↑↑

В качестве альтернативы вы можете использовать форму %{}:

template_string = "class=btn 'submit-button %{additional_classes}'"
#                                            ↑                  ↑

format(template_string, additional_classes: 'some-class')
#=> "class=btn 'submit-button some-class'"
#                             ↑↑↑↑↑↑↑↑↑↑↑
0 голосов
/ 30 августа 2018

Из тонкой инструкции :

формат (format_string [, arguments ...]) → строка
[...]
Для более сложного форматирования Ruby поддерживает ссылку по имени. Стиль %<name>s использует стиль формата, а стиль %{name} - нет.

Документация не так ясна, как могла бы быть, но когда вы используете форму %<...>, она ожидает увидеть %<name>s, где name - это ключ хеша, а s - тип формата: s для строки, d для числа, ... Если вы говорите:

%<additional_classes>'

затем format попытается интерпретировать ' как тип, когда такого спецификатора типа нет, поэтому вы получите ArgumentError, потому что строка формата искажена.

Вы, вероятно, хотите использовать форму %{...} вместо:

template_string = "class='btn submit-button %{additional_classes}'"
#--------------------------------------------^------------------^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...