最近気づいたのですが、Ruby の文字列リテラル (例: 'a' "b" 'c'
) を並べると、それらの文字列リテラルを連結したことになります。ただし、この言語機能についてはどこにも文書化されていません。「並置」と「連結」という用語を使用して検索しましたが、いくつかの StackOverflow 応答でのみ参照が見つかりました。誰かが私に決定的な参照を指摘できますか?
4 に答える
アップデート
これは現在、Ruby に同梱されている RDoc で公式に文書化されています。
変更は、次にドキュメントをビルドするときにRubyDocに反映されます。
追加されたドキュメント:
Adjacent string literals are automatically concatenated by the interpreter:
"con" "cat" "en" "at" "ion" #=> "concatenation"
"This string contains "\
"no newlines." #=> "This string contains no newlines."
Any combination of adjacent single-quote, double-quote, percent strings will
be concatenated as long as a percent-string is not last.
%q{a} 'b' "c" #=> "abc"
"a" 'b' %q{c} #=> NameError: uninitialized constant q
オリジナル
現在、これは公式の Ruby ドキュメントのどこにもありませんが、そうあるべきだと思います。コメントで指摘されているように、ドキュメントの論理的な場所は次のとおりです。 http://www.ruby-doc.org/core-2.0/doc/syntax/literals_rdoc.html#label-Strings
ドキュメントを追加して、 ruby/rubyでプル リクエストを開きました。
このプル リクエストがマージされると、http://www.ruby-doc.orgが自動的に更新されます。その場合は、この投稿を更新します。^_^
私がオンラインで見つけたこれに関する唯一の他の言及は次のとおりです。
The Ruby Programming Language, page 47 に参照があります。
コード内で文字列リテラルを分割したいが、それらを連結する (そして 3 つ以上の文字列を作成する) 代償を払いたくない状況では、意図的にパーサーにあるように見えます。改行がなく、行長の無効化コードを必要としない長い文字列が良い例です
text = "This is a long example message without line breaks. " \
"If it were not for this handy syntax, " \
"I would need to concatenate many strings, " \
"or find some other work-around"
つるはしリファレンスに加えて、いくつかの単体テストがあります。
# compile time string concatenation
assert_equal("abcd", "ab" "cd")
assert_equal("22aacd44", "#{22}aa" "cd#{44}")
assert_equal("22aacd445566", "#{22}aa" "cd#{44}" "55" "#{66}")
改行を埋め込まずに、長い一重引用符で囲まれた文字列リテラルを複数の行に分割したい場合。
複数の隣接する文字列リテラルに分割するだけで、Ruby インタープリターは解析プロセス中にそれらを連結します。
str = "hello" "all"
puts str #=> helloall
ただし、ruby が改行をステートメント終了文字として解釈しないように、リテラル間の改行をエスケープする必要があることを覚えておいてください。
str = "hello" \
" all" \
" how are you."
puts str #=> hello all how are you