🌟

[Feature #17398] エンドレスメソッド定義の本体が statement だった場合にエラーになるチケット

に公開

[Feature #17398] SyntaxError in endless method

  • 以下のようにエンドレスメソッド定義の本体が statement だった場合にエラーになる、というチケット
# OK
def foo() = puts("bar")

# syntax error, unexpected string literal, expecting `do' or '{' or '('
def hoge() = puts "bar"
  • このチケットは5年前でこの問題自体は Ruby 3.1 で対応されました
def hoge() = puts "bar"
# Ruby 3.0 => syntax error, unexpected string literal, expecting `do' or '{' or '('
# Ruby 3.1 => OK
  • しかし、当時は以下のように メソッド def hoge = xxx yyy みたいな構文には対応できずに Ruby 3.4 でもシンタックスエラーになったままでした
private def hoge() = puts "bar"
# test.rb:1: syntax error found (SyntaxError)
# > 1 | private def hoge() = puts "bar"
#     |                           ^ unexpected string literal, expecting end-of-input
#   2 |
  • それが最近対応されて開発版の Ruby 3.5 では以下のようにかける用になりました
private def hoge() = puts "bar"
# Ruby 3.4 => NG
# Ruby 3.5 => OK

hoge # => bar
  • この構文は以下のような仕様に準じている
    • private :m, def hello = puts "Hello"
      • これはシンタックスエラーになる
      • これは obj.m 0, cmd 1, 2 がシンタックスエラーになるとの同じ理由
    • private def hello = puts "Hello", "World"
      • これは private def hello = puts("Hello", "World") のように解釈される
        • private (def hello = puts "Hello"), "World" とはならない
      • これも obj.m cmd 1, 2obj.m cmd(1, 2) となるのと同じ理由
    • private def hello = puts "Hello" do expr end
      • これは private (def hello = puts "Hello") do expr end のように解釈される
        • private (def hello = puts "Hello" do expr end) とはならない
      • これも obj.m cmd 1, 2 do expr endobj.m (cmd 1, 2) do expr end になるとの同じ理由
  • これは Prism でも parse.y でも開発版の Ruby 3.5-dev で対応済み
GitHubで編集を提案

Discussion