Строковая интерполяция с многострочным отступом - PullRequest
0 голосов
/ 29 августа 2018

С учетом многострочной строки:

body = "\
{
  {
    foo
  }
}"

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

{
  {
    {
      {
        foo
      }
    }
    {
      {
        foo
      }
    }
  }
}

, в котором подстрока body должна интерполироваться дважды.

Делаем это:

puts "\
{
  {
    #{body}
    #{body}
  }
}
"

производит:

{
  {
    {
  {
    foo
  }
}
    {
  {
    foo
  }
}
  }
}

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

Есть ли хороший способ сохранить элегантность #{} интерполяции строк и получить отступ?

Ответы [ 2 ]

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

Не совсем то, что вы хотели, но хороший компромисс между удобочитаемостью и простотой реализации, при условии, что вы используете ActiveSupport:

body = "\
{
  {
    foo
  }
}"

puts "\
{
  {
#{body.indent(4)}
#{body.indent(4)}
  }
}
"
0 голосов
/ 29 августа 2018

Прекрасно сохраняет отступ. Ваше тело имеет 2 пробела перед вторым открытием фигурных Почему вы ожидаете, что он узнает, что он находится внутри двух уже открытых фигур, и должен волшебным образом добавить отступ?

Вы можете использовать свой собственный отступ, хотя:

 indent = ->(anything, level = 0, indenter = "  ") do
   anything.split($/).map.with_index do |line, idx|
     next line if idx.zero?
     line.prepend(indenter * level)
   end.join($/)
 end

 body = "\
 {
   {
     foo
   }
 }"

 puts "\
 {
   {
     #{indent.(body, 2)}
     #{indent.(body, 2)}
   }
 }"

#⇒ {
#    {
#      {
#        {
#          foo
#        }
#      }
#      {
#        {
#          foo
#        }
#      }
#    }
#  }
...