Closed hanachin closed 5 years ago
すごくどうでもいいのですが、1.method(:*)*1
のようなコードがあると壊れそうな気がしました
Method classに*
は定義されていないのでこういうコードはそもそもないとは思いますが。。
確かに壊れそうですね。*
は定義されていないけど<<
や>>
があるので可能性0ではなさそう...(どう対応すればいいんだろう?)
irb(main):001:0> %w(foo bar bazz).map(&"foo: ".method(:+)<<proc(&:upcase))
=> ["foo: FOO", "foo: BAR", "foo: BAZZ"]
irb(main):002:0> %w(foo bar bazz).map(&"foo: ".method.:+<<proc(&:upcase))
Traceback (most recent call last):
5: from /usr/local/var/rbenv/versions/2.7.0-dev/bin/irb:23:in `<main>'
4: from /usr/local/var/rbenv/versions/2.7.0-dev/bin/irb:23:in `load'
3: from /usr/local/var/rbenv/versions/2.7.0-dev/lib/ruby/gems/2.7.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
2: from (irb):2
1: from (irb):2:in `method'
ArgumentError (wrong number of arguments (given 0, expected 1))
お、例に挙げられているコードは壊れなさそうです。"foo: ".:+<<proc(&:upcase)
にauto correctされるべきっぽく見えます(実装がそうauto correctされるようになっているかまでは見てません。。)
1.method(:*)*1
は、1.:**1
にauto correctされるのですが、そうすると:*
と*
がくっついて**
になってしまうなーと思っていました。
これは.:
にした時にメソッド名と後ろトークンがくっつくかどうかを見てあげれば防げそうですが、愚直にやる以外の方法は特に思いついてないです。。
あ、なんかすみません勘違いしていました。確かにさっき書いたコメントのは壊れないですね。。
多分書かないけどこういうのも壊れますね (Syntax errorになる)
{42.method(:!)=>42}
{42.:!=>42}
一旦()
で囲うように置換してStyle/RedundantParenthesesとLayout/SpaceAroundOperatorsにOMAKASE...とも思いましたがparser gemが対応するまでは一度.:
にするとパースできなくなってしまう :thinking:
Method reference operator は Ruby 2.7 (ならびに Parser gem) の masterから revert されているためクローズします。
書いてみました https://github.com/hanachin/rubocop/commit/6360ff7722538aaa832da997e2715d57e3b6f65c