1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rubyのコードを改行で千切ってみる

1
Posted at

コードの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 があるのも試しやすい。

参考記事

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?