Проблема в том, что у 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...")
.