Операторы в скобках внутри документа в качестве аргумента? - PullRequest
0 голосов
/ 26 апреля 2018

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

method(<<EOF)[0][0]
lots of text
EOF

Что может означать оператор квадратных скобок? Кто-нибудь знает, что это за идиома?

1 Ответ

0 голосов
/ 27 апреля 2018

Проблема в том, что у heredocs есть несколько запутанная структура, которая нарушает нормальный поток кода. Содержимое heredoc начинается на строке сразу после <<EOF, который открывает heredoc, и заканчивается на EOF, который закрывает heredoc, но выражение, которое содержит heredoc, продолжается слева направо, как обычно.

Структура:

method(<<EOF)[0][0]
lots of text
EOF

на самом деле больше похоже на это:

      /<<EOF       \
      |lots of text|
      |lots of text|
method|lots of text|[0][0]
      |lots of text|
      |lots of text|
      \EOF         /

, где косые черты и вертикальные черты - грубая попытка нарисовать очень высокие скобки ASCII; или, если у вас есть правильный шрифт Unicode:

      ⎛<<EOF       ⎞
      ⎜lots of text⎟
      ⎜lots of text⎟
method⎜lots of text⎟[0][0]
      ⎜lots of text⎟
      ⎜lots of text⎟
      ⎝EOF         ⎠

Вы можете думать о heredocs как о смешно выглядящей двойной кавычке (или %Q(...), если хотите), которая идет вертикально, а не горизонтально, как остальная часть вашего кода.

Было бы (ИМО) более последовательным написать:

method(<<EOF
lots of text
EOF)[0][0]

но у heredocs есть долгая история (вплоть до /bin/sh), с которой мы застряли.

Возвращаясь к реальному вопросу: часть [0][0] этого выражения вообще не находится внутри heredoc, это просто применяется к тому, что возвращает method("lots of text\nlots of text\n...").

...