🌟
[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, 2がobj.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 endがobj.m (cmd 1, 2) do expr endになるとの同じ理由
- これは
-
- これは
Prismでもparse.yでも開発版の Ruby 3.5-dev で対応済み
Discussion