这里的托架操作员 - 作为参数记录?

时间:2018-04-26 19:12:13

标签: ruby heredoc

我看到一个here-document用作参数,里面有方括号运算符。看起来像是:

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

方括号运算符的含义是什么?有谁知道那是什么样的成语?

1 个答案:

答案 0 :(得分:9)

问题在于heredocs有一些混乱的结构会破坏正常的代码流。 heredoc的内容在打开heredoc的<<EOF之后立即开始,并在关闭heredoc的EOF结束,但包含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(...),如果你愿意的话),它是垂直的而不是像你的其他代码一样水平。

(IMO)会更加一致地写作:

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

但是heredocs有着悠久的历史(一直追溯到/bin/sh)我们一直坚持下去。

回到真正的问题:该表达式的[0][0]部分根本不在heredoc中,只是应用于method("lots of text\nlots of text\n...")返回的内容。