Project

General

Profile

Bug #15416

配列リテラル内の引数を伴う括弧なしのメソッド呼び出しで syntax error

Added by shuujii (Shuji KOBAYASHI) over 1 year ago. Updated over 1 year ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.6.0rc1 (2018-12-06 trunk 66253) [x86_64-linux]
[ruby-core:90539]

Description

以下のような配列リテラル内の引数を伴う括弧なしのメソッド呼び出しで syntax error が発生します。

$ ruby -ce '[p 1]'
-e:1: syntax error, unexpected tINTEGER, expecting do or '{' or '('
[p 1]
   ^

メソッドの [][]= の中ではエラーにならないので許容されたほうが良いと思います。

$ ruby -ce '{}[p 1]'
Syntax OK

$ ruby -ce '{}[p 1]=1'
Syntax OK

なお、Ruby 1.8 ではエラーになりませんでした。

$ ruby187 -vce '[p 1]'
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
Syntax OK

添付のパッチで許容されるようになった気がします。


Files

Updated by osyo (manga osyo) over 1 year ago

これですが、メソッド呼び出しに () を付けると問題ないようですね

$ ruby -ce '[p(1)]'
Syntax OK

また、 () をつけない場合、次のような問題があるかと思います。

def meth a, b = 42
    a + b
end

def hoge
    [meth 1, 2] # => [meth(1), 2] or [meth(1, 2)] ?
end

hoge # => [43, 2] or [3] ?

Updated by osyo (manga osyo) over 1 year ago

もうちょっと調べてみたんですが #[] だと [meth(1, 2)] として扱われるんですね、なるほど。

class X
    def [](*args)
        args
    end
end

def meth a, b = 42
    a + b
end

def hoge
    X.new[meth 1, 2] # => [meth(1, 2)]
end

hoge # => [3]
#3

Updated by nobu (Nobuyoshi Nakada) over 1 year ago

1.8でも -w オプション付きなら警告が出るようになったはずだったんですが、結局その1.8.8はリリースされず1.9になってしまったんですよね…。

Updated by matz (Yukihiro Matsumoto) over 1 year ago

  • Status changed from Open to Closed

まつもと ゆきひろです。

一貫性という観点からは、両方共括弧なしでは呼べないという風にしたいのですが、どうやら互換性の問題が大きいので、とても直せそうにありません。ということで、苦肉の策ですが、現状維持とします。

調べると2006年まで両方とも「括弧を省略するな」という警告を出してました。が、リテラル内は2006年に文法エラーにできましたが、引数の方は、2007年にあきらめてしまって警告もなくしてしまってたようです。犯人は私ですがまったく覚えていなかった。禁止できるか試してみましたが、各方面に影響が出るので、これは諦めます。

Matz.

Also available in: Atom PDF