Рубиновая линия разрыва при интерполяции нескольких строк

#ruby

Вопрос:

Я хочу добавить ниже 5 строк, используя интерполяцию. Каждая строка должна быть разделена новой строкой:

 ts = (Time.now.getutc.to_f * 1000).to_i.to_s
nonce = SecureRandom.uuid
host = 'example.com'
resource_path = '/v3/workflows/auth_flow/test'
body_hash = { some: 'hash' }.to_s
 

Для этого я пытаюсь:

 signature = "#{ts}n#{nonce}n#{host}n#{resource_path}n#{body_hash}"
 

Но я не уверен, что это правильный путь, потому что я получаю:

 2.7.0 :105 > signature
 => "1637625282656n666256a1-656c-49ed-b816-47211aecb4b4nexample.comn/v3/workflows/auth_flow/testn{:some=>"hash"}"
 

Разве это не просто добавляет дополнительную строку «n» вместо новой строки после каждой строки?

Комментарии:

1. Если вам просто нужно присоединиться к ним с определенным символом, почему бы не использовать #join ?

2. Если я использую signature = [ts, nonce, host, resource_path, body_hash].join("n") , результат будет таким же. Означает ли это, что это должно выглядеть так? Я в этом не уверен

3. Когда вы выполняете интерполяцию строк, каждая вещь, интерполированная неявно #to_s , вызывается. Если вам нужно другое поведение для строкового представления каждого объекта, вам нужно будет сделать это явно.

4. Это странно. n все должно быть в порядке. Что вы используете для печати signature на выходе?

5. Это правильно, консоль отображает результат inspect вызова в строке. Вы можете увидеть фактическую строку, когда отобразите ее с помощью puts signature

Ответ №1:

Ваш код верен, и это ожидаемый результат. IRB вызывает inspect метод для каждого объекта, который он пытается отобразить в качестве возвращаемого значения. Для строки это означает обертывание в двойные кавычки и экранирование специальных символов, включая «n». Вы можете «заставить» его отображать строку как есть puts signature .

В случае фактической n строки длиной в два символа она будет выглядеть следующим образом "\n"