zsuperの振る舞い

RuboCop というか Parser gem では、引数なしの superzsuper (zero arity super) という名前で表している。

以下のケースについて、Lint/ShadowedArgument cop はデフォルトで offense を出す。

def do_something(arg)
  arg = 'world'
  super
end

しかし、これは以下のように引数なし super の振る舞いの特性により offense を出してもらいたくないケースがある。

class Foo
  def do_something(arg)
    "hello, #{arg}"
  end
end

class Bar < Foo
  def do_something(arg)
    arg = 'world'
    super
  end
end

puts Bar.new.do_something('hi') # => 'hello, world'

サブクラスを少し変えた振る舞いはこのとおり。

class Bar < Foo
  def do_something(arg)
    super
  end
end

puts Bar.new.do_something('hi') # => 'hello, hi'

IgnoreImplicitReferencestrue にすることで、これらのような zsuper の使い方を受け入れる設定になる。

Lint/ShadowedArgument:
  IgnoreImplicitReferences: true