プログラムの文字列表現、あるいはクォーテーションの使い分けの話
きっかけ
をみて、今の世の中はどんなことになっているのかと思った次第。
本題
一応話のきっかけの人がJavaScriptとPythonが学校教育で多く使われているからという補足をしているので、
JavaScriptとPythonを先頭に、後はなるべく辞書順になるように記載したいと思います。
JavaScript
- シングルクォート:文字列リテラル(文字列定数)
- ダブルクォート:文字列リテラル(文字列定数)
- その他
- バッククォート:テンプレートリテラル(テンプレート文字列)
バッククォートで囲うと(エスケープ文字ではない)改行も使えます。
別枠で扱うか迷いましたが、TypeScriptも同様だと思ってます。
Python
- シングルクォート:shortstring
- ダブルクォート:shortstring
- その他
- シングルクォート三つ:longstring
- ダブルクォート三つ:longstring
- 頭にfかF:フォーマット済み文字列リテラル化
shortstringとlognstringの違いは
shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::= shortstringchar | stringescapeseq
longstringitem ::= longstringchar | stringescapeseq
shortstringchar ::= <any source character except "\" or newline or the quote> ここ と
longstringchar ::= <any source character except "\"> ここ
shortstringcharは\と改行とクォートは文字に含まれないのに対し、
longstringcharは\のみが文字に含まれないってことですね。
普段使っている人は体感で分かっていると思いますが、要は三重引用符だと改行が使えます。
C#
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
C#の場合は文字列としてシングルクォーテーションで囲むのは間違いです。
C++
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
- その他
- お尻にs:std::stringリテラル
JSで言う文字列リテラルはstd::stringリテラルが近いと思います。(ごめんなさい、多分です。エアプです)
Cの場合は文字列としてシングルクォーテーションで囲むのは間違いです。
Clojure
- シングルクォート:評価遅延
- ダブルクォート:文字列リテラル
- その他
- バックスラッシュ+文字:文字リテラル
COBOL
gnucobol
- シングルクォート:Alphanumeric Literals
- ダブルクォート:Alphanumeric Literals
Crystal
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル(変数展開有)
- その他
- ダブルクォートの頭にコロン:シンボル(ダブルクォートが無くてもシンボル)
- パーセント+特定の区切り文字:文字列リテラル(変数展開有)
- パーセント+q+特定の区切り文字:文字列リテラル(エスケープ無し)
- パーセント+Q+特定の区切り文字:文字列リテラル(変数展開有)
CSS
- シングルクォート:<string> データ型
- ダブルクォート:<string> データ型
JSでは使えるけどバッククォートはNG
Dart
- シングルクォート:文字列リテラル(変数展開有り)
- ダブルクォート:文字列リテラル(変数展開有り)
- その他
- クォートの頭にr:文字列リテラル(エスケープ無し)
- クォート三つ:文字列リテラル(改行有り、変数展開有り)
- クォート三つの頭にr:文字列リテラル(改行有り、エスケープ無し)
Delphi
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
Elixir
- シングルクォート:文字リスト
- ダブルクォート:文字列リテラル(変数展開有、改行有)
- その他
- クエスチョン+文字:文字リテラル
- チルダ+s+特定の区切り文字:ダブルクォート相当
- チルダ+c+特定の区切り文字:シングルクォート相当
- チルダ+S+特定の区切り文字:文字列リテラル
Erlang
- シングルクォート:アトム
- ダブルクォート:文字列リテラル
- その他
- シングルクォートで囲まなくてもアトム
F#
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
- その他
- ダブルクォート三つ:文字列リテラル(エスケープ無し)
- ダブルクォートの頭に@:文字リテラル(エスケープ無しに近い)
Go
- シングルクォート:rune_lit(文字リテラル)
- ダブルクォート:interpreted_string_lit(文字列リテラルでエスケープ有)
- その他
- バッククォート:raw_string_lit(文字列リテラルでエスケープ無し改行有)
Groovy
- シングルクォート:文字列リテラル
- ダブルクォート:文字列リテラル(変数展開有)
- その他
- シングルクォート三つ:文字列リテラル(改行有)
- ダブルクォート三つ:文字列リテラル(変数展開有、改行有)
- スラッシュ:文字列リテラル(エスケープ無しに近い、0文字はコメントと被るのでNG)
- ダラー+スラッシュ:文字列リテラル(スラッシュのみより更にエスケープ無しに近い)
Haskell
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
HSP
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
Java
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
Javaの場合は文字列としてシングルクォーテーションで囲むのは間違いです。
Julia
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
- その他
- ダブルクォート三つ:文字列リテラル
kotlin
- シングルクォート:文字リテラル
- ダブルクォート:String templates
- その他
- ダブルクォート三つ:raw string (変数展開は有)
LISP
common-lisp
- シングルクォート:expression
- ダブルクォート:文字列リテラル
- その他
- シャープ+バックスラッシュ+文字:文字リテラル
Matlab
- シングルクォート:文字列リテラル?文字リテラルだけど連続して書けて配列化してくれる感じ?
- ダブルクォート:文字列リテラル
Objective-C
???
何をObjective-Cの公式と呼べばいいか知識不足で判断つかず。
- シングルクォート:おそらくC準拠で文字リテラル?
- ダブルクォート:おそらくC準拠で文字列リテラル?
Perl
- シングルクォート:文字列リテラル
- ダブルクォート:文字列リテラル(変数展開有)
- その他
- q特定の記号で囲む:シングルクォート代替
- qq特定の記号で囲む:ダブルクォート代替
PHP
- シングルクォート:文字列リテラル(エスケープも最小限)
- ダブルクォート:テンプレートリテラルに近い文字列リテラル(変数展開有)
- その他
- <<<string:ヒアドキュメント <<<の後ろに書いた文字列が出てくるまで全部。jsのテンプレートリテラルの使い勝手はこっち
- <<<'string':Nowdoc <<<の後ろに書いた文字列が出てくるまで全部。シングルクォートとほぼ同じ性質
単に文字列の定義と言った場合は基本的にシングルクォーテーションで囲います。
R
???
PDFのどこかに記載あるんですかね? ちょっと無理でした
- シングルクォート:?(サンプル等から文字列リテラルであろうことはなんとなく分かる)
- ダブルクォート:?(サンプル等から文字列リテラルであろうことはなんとなく分かる)
Ruby
- シングルクォート:文字列リテラル(エスケープも最小限)
- ダブルクォート:テンプレートリテラルに近い文字列リテラル(変数展開有)
- その他
- ?の後に文字を1字:文字リテラル
- バッククォート:コマンド出力
- <<string:ヒアドキュメント <<の後ろに書いた文字列が出てくるまで全部。
- シングルクォート,ダブルクォート,バッククォートでstringを囲むことでそれぞれの性質を付与
Rust
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
- その他
- ダブルクォートの頭にr:文字列リテラル(エスケープ無し)
Scala
https://www.ne.jp/asahi/hishidama/home/tech/scala/literal.html#h_String)
(※docsにろくな情報が無いのはどういうことなんですかね?
- シングルクォート:文字リテラル
- ダブルクォート:文字列リテラル
- その他
- ダブルクォート三つ:文字列リテラル(改行有、エスケープ無しに近い)
- ダブルクォートの頭にs:文字リテラル(変数展開有)
- ダブルクォートの頭にf:文字リテラル(書式付き変数展開有)
- ダブルクォートの頭にraw:文字リテラル(変数展開有、エスケープ無し)
- ダブルクォートの頭にメソッド名:カスタム補間子(StringContextもしくはStringContext に新しいメソッドを追加した際のメソッド名、上記三つも実際はコレ)
- シングルクォート(囲まない):シンボル(より厳密な定数みたいな感じの印象)
- XML:XML
shell
bash
- シングルクォート:inhibit all interpretation
- ダブルクォート:suppress most of the interpretation
- 頭にダラー:ANSI-C Quoting
SQL
postgresql
- シングルクォート:文字列リテラル
- ダブルクォート:引用符付き識別子
Swift
- シングルクォート:?(文字リテラル?)
- ダブルクォート:文字列リテラル(変数展開有)
- その他
- ダブルクォート三つ:文字列リテラル(改行有)
- ダブルクォートの頭に#:文字列リテラル(エスケープ無しに近い、変数展開有だが記法が#無しと異なる)
VBA
- シングルクォート:コメント
- ダブルクォート:文字列リテラル(改行有)
- その他
- ダブルクォートのお尻にc:文字リテラル
なでしこ
- シングルクォート:?
- ダブルクォート:文字列リテラル(改行有)(ドキュメントを眺めるとたまに「」の代わりに出てくる)
- その他
-「」:文字列リテラル(変数展開有)
調査するプログラム言語を何にするかの参考にした情報
調査中に見つけたサイト
まとめ
文字列ではないものは×
変数展開が伴うなど定数定義には向かなそうなものは※
上記以外は〇
にしたつもりです
言語 | シングル | ダブル | 備考 |
---|---|---|---|
JavaScript | 〇 | 〇 | |
Python | 〇 | 〇 | |
C# | × | 〇 | |
C++ | × | 〇 | |
Clojure | × | 〇 | |
COBOL | 〇 | 〇 | 自信ありません! |
Crystal | × | ※ | |
CSS | 〇 | 〇 | |
Dart | ※ | ※ | 区別は無さそうだけどどちらも変数展開有 |
Delphi | × | 〇 | |
Elixir | × | ※ | |
Erlang | × | 〇 | |
F# | × | 〇 | |
Go | × | 〇 | |
Groovy | 〇 | ※ | 使い分けるのがおススメ |
Haskell | × | 〇 | |
HSP | × | 〇 | |
Java | × | 〇 | |
Julia | × | 〇 | |
kotlin | × | ※ | 変数展開がされないパターンが無い? |
LISP | × | 〇 | |
Matlab | 〇 | シングルは判断つかず | |
Objective-C | × | 〇 | たぶん |
Perl | 〇 | ※ | 使い分けるのがおススメ |
PHP | 〇 | ※ | 使い分けるのがおススメ |
R | ※ | ※ | 力不足の為、公式から拾えませんでした |
Ruby | 〇 | ※ | 使い分けるのがおススメ |
Rust | × | 〇 | |
Scala | × | 〇 | |
shell | ※ | ※ | |
SQL(postgresql) | 〇 | × | |
Swift | × | ※ | 変数展開有 |
VBA | × | 〇 | |
なでしこ | × | ※ |
どちらも〇の場合は文字列内に引用符を使う機会が少ない方を選択するのがおススメです。
例えばSQLをORM使わずに書く機会が多い場合は二重引用符を使うのが楽ですね。
ドキュメントを読んでから作業をするクセを付けたいですね!
お疲れさまでした。
Discussion