rubocop / rubocop-jp

A place for RuboCop discussions in Japanese
55 stars 2 forks source link

method methodはMethod reference operatorで書くようにするcop #47

Closed hanachin closed 5 years ago

hanachin commented 5 years ago

書いてみました https://github.com/hanachin/rubocop/commit/6360ff7722538aaa832da997e2715d57e3b6f65c

pocke commented 5 years ago

すごくどうでもいいのですが、1.method(:*)*1のようなコードがあると壊れそうな気がしました Method classに*は定義されていないのでこういうコードはそもそもないとは思いますが。。

hanachin commented 5 years ago

確かに壊れそうですね。*は定義されていないけど<<>>があるので可能性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))
pocke commented 5 years ago

お、例に挙げられているコードは壊れなさそうです。"foo: ".:+<<proc(&:upcase)にauto correctされるべきっぽく見えます(実装がそうauto correctされるようになっているかまでは見てません。。)

1.method(:*)*1は、1.:**1にauto correctされるのですが、そうすると:**がくっついて**になってしまうなーと思っていました。

これは.:にした時にメソッド名と後ろトークンがくっつくかどうかを見てあげれば防げそうですが、愚直にやる以外の方法は特に思いついてないです。。

hanachin commented 5 years ago

あ、なんかすみません勘違いしていました。確かにさっき書いたコメントのは壊れないですね。。

多分書かないけどこういうのも壊れますね (Syntax errorになる)

{42.method(:!)=>42}
{42.:!=>42}

一旦()で囲うように置換してStyle/RedundantParenthesesとLayout/SpaceAroundOperatorsにOMAKASE...とも思いましたがparser gemが対応するまでは一度.:にするとパースできなくなってしまう :thinking:

koic commented 5 years ago

Method reference operator は Ruby 2.7 (ならびに Parser gem) の masterから revert されているためクローズします。