Actions
Bug #15416
closed配列リテラル内の引数を伴う括弧なしのメソッド呼び出しで syntax error
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.6.0rc1 (2018-12-06 trunk 66253) [x86_64-linux]
Backport:
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) almost 6 years 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) almost 6 years 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]
Updated by nobu (Nobuyoshi Nakada) almost 6 years ago
1.8でも -w オプション付きなら警告が出るようになったはずだったんですが、結局その1.8.8はリリースされず1.9になってしまったんですよね…。
Updated by matz (Yukihiro Matsumoto) almost 6 years ago
- Status changed from Open to Closed
まつもと ゆきひろです。
一貫性という観点からは、両方共括弧なしでは呼べないという風にしたいのですが、どうやら互換性の問題が大きいので、とても直せそうにありません。ということで、苦肉の策ですが、現状維持とします。
調べると2006年まで両方とも「括弧を省略するな」という警告を出してました。が、リテラル内は2006年に文法エラーにできましたが、引数の方は、2007年にあきらめてしまって警告もなくしてしまってたようです。犯人は私ですがまったく覚えていなかった。禁止できるか試してみましたが、各方面に影響が出るので、これは諦めます。
Matz.
Actions
Like0
Like0Like0Like0Like0