#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"