6

何かをgsubしようとしているHTMLページでirbを使用して、少し正規表現のテストをしたかったのです。

しかし、誰もが知っていて愛用している HEREDOC 構文は、Ruby では異なるようです。

irb(main):140:0> text = <<-FUNUNU <p class="firstpara">
irb(main):141:0" FUNUNU
irb(main):142:0*
irb(main):143:0* puts text
SyntaxError: compile error
(irb):140: syntax error, unexpected kCLASS, expecting kDO or '{' or '('
text = <<-FUNUNU <p class="firstpara">
                         ^
(irb):143: syntax error, unexpected tIDENTIFIER, expecting kDO or '{' or '('
        from (irb):143
        from :0

それを解釈しようとして、文字列の内容について不平を言っているようです。HEREDOC構文で見つけたすべてのドキュメントから、キーワード間のすべてが変数の一部であるべきであることがすべて指摘されています。しかし、そうではないようです。

HEREDOC 文字列が HEREDOC インジケータの 2 番目の式で終わること以外に、文字列の内容に関する書式の制限はありますか?

4

3 に答える 3

15

ヒアドキュメント区切り文字の同じ行に文字列を配置することはできません。区切り文字の後、同じ行に Ruby コードを配置することが許可されているためです。つまり、

irb> text = <<-FOO # Ruby code allowed here...
irb*   <a class="foo">
irb* FOO
# => "<a class=\"foo\">\n" 
irb> text
# => "<a class=\"foo\">\n"

これは、次のように記述できるためです。

irb> instance_eval(<<-CODE)
irb* def foo
irb*   "foo"
irb* end
irb* CODE

あるいは:

def foo(a, b, c)
  [a, b, c]
end

foo(<<-A, <<-B, <<-C)
foo
A
bar
B
baz
C
# => ["foo\n", "bar\n", "baz\n"]
于 2013-06-13T13:36:34.917 に答える
6

指摘されているように、ヒアドキュメント テキストは、ヒアドキュメント ターミネータの次の行から始まります。これは、これらの回答を置き換えることを意図したものではなく、典型的なヒアドキュメント構文よりも優れた代替手段を提供するものです。

私は個人的に使用することを好みます%q{}。一重引用符を使用することと同じです。以下は同じ出力を与えます:

text = %q{ <a class="foo"> }
text = ' <a class="foo"> '

文字列補間を使用したい場合:

text = %Q{ <a class="#{class_name}">}

{}を他のターミネータに切り替えることもできます。次の 2 行では、まったく同じ出力が得られます。

text = %Q[ <a class="#{class_name}">] 
text = %Q| <a class="#{class_name}">|

そして、それらは複数の行をサポートしています:

text = %q{<p>
Some text
</p>}

この SO の質問には、この構文のさまざまな用途に関するいくつかの適切な回答があります。

于 2013-06-13T13:47:36.287 に答える
2

ヒアドキュメントの最初の行では、余分なルビを使用できます。文字列はキャリッジ リターンの後に始まります。

http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#here_doc

于 2013-06-13T13:34:37.160 に答える