コードの1行が長くなってしまった際など、可読性のために改行を入れて次の行に折り返すことがある。
Ruby では改行を入れる場所によって、 次の行に続いている と判断される場合と、 文の区切りである と判断される場合がある。
あるとき改行でミスしたことをきっかけに、 「じゃあどこなら改行が行継続となるのか」 と気になった。
しかし明快なドキュメントは見つけられず、また Ruby パーサの Prism を見たもののソースコードが難しく、正確な条件はわからなかった。
しかたないので趣向を変えて、実際に簡単なコードに改行をたくさん入れてみて、改行してはいけない位置を探ってみることにした。(闇雲ではなく、パーサを読んで気になった部分を狙っている)
Ruby バージョン:4.0.2
サンプルコード
何の意味もない 1行のコードで試す。
puts ["R" + "UBY"&.downcase, true ? 4.0 : 3.5]
Ruby
4.0
改行を入れた結果
同じ処理になるコードは以下の通り。これ以上改行で分割すると、構文エラーになるか動作が変わる。(同じ処理かどうかは、 Prism で構文解析して抽象構文木が同じになることを確認した)
puts [
"R" +
"UBY"
&.
downcase ,
true ?
4.0
:
3.5
]
※区切りを見やすくするため , の手前にスペースを追加した。
改行を入れていない箇所
- 当然ながら…
- 識別子や予約語などを分割すると意味が崩れる
-
&.もこれで1つなので分割できない
-
- 文字列の中で改行すると、改行文字が含まれてしまう
- なお
"UBY\n"なら puts で出力すると同じになるが、意味が変わるため除外した
- なお
- 識別子や予約語などを分割すると意味が崩れる
-
puts [- 改行した場合、
putsは引数なしのメソッド呼び出し、[...]はどこにも代入しない配列になるため意味が変わる
- 改行した場合、
-
"R" +-
+の手前で改行すると、+は二項演算子でなく単項演算子になるため意味が変わる - また、改行すると2つの式になるが、配列や引数などではその状態は受け入れない(構文エラー)
- 「カンマ区切りし忘れた別の要素」と解釈される
-
-
downcase ,- 配列や引数などにおいて、カンマの前では改行できない(構文エラー)
-
true ?- 三項演算子のうち、
?の手前だけは改行できない(構文エラー)
- 三項演算子のうち、
感想
カンマの前で改行できないのが意外だった(したい機会も無いけれど)。けっこう改行の影響力が大きそう。
三項演算子の ? の手前では改行できない(が : の手前では改行できる)のも知らなかった。こちらはほとんどの二項演算子も同様なので、基本的なルールなのかなという感じ。
Prism を初めて触ってみたけれども、簡単に構文解析や字句解析ができて便利だった。公式ページに playground があるのも試しやすい。
参考記事