Bug #6434
closedBlock passed implicitly via super
Description
=begin
Block is being passed via super implicitly even though the method is explicit and does not pass the block when calling super.
class H < Hash
def initialize(default=nil, &block)
super(default)
end
end
H.new(0){}
ArgumentError: wrong number of arguments
from (pry):3:in `initialize'
Hash#initialize doesn't allow both a default argument and a default_proc, which is the cause of this error. Which means the block is being passed up even though it should not be.
=end
Updated by trans (Thomas Sawyer) over 12 years ago
Crap, could an admin please fix the use of RD in my post. And while I am on the subject, can we just make RD mode always on and be done with it?
Updated by shyouhei (Shyouhei Urabe) over 12 years ago
- Description updated (diff)
Updated by nobu (Nobuyoshi Nakada) over 12 years ago
- Status changed from Open to Rejected
=begin
It's a spec.
(({super})) inherits the given block if it's not given directly.
You can call (({super(default, &nil)})) not to pass it.
=end
Updated by trans (Thomas Sawyer) over 12 years ago
I see. It's not intuitive, obviously, but I suppose it makes sense for how Ruby handles implicit yield in general. Nonetheless, wouldn't it be better if this did not apply when a explicit block argument is used?
would pass block implicitly¶
def foo
super
end
would NOT pass block implicitly¶
def foo(&block)
super
end
In any case I discovered the use of &nil
as a work around prior to posting this and that does the trick. Thanks.
Updated by alexeymuranov (Alexey Muranov) over 12 years ago
Just a note: super
without arguments is documented to pass all arguments, so to not pass a block can only be expected from super()
Updated by trans (Thomas Sawyer) over 12 years ago
@alexey I thought that was no longer true for 1.9.
Updated by alexeymuranov (Alexey Muranov) over 12 years ago
@thomas (Thomas Fritzsche), i didn't know it could change. In fact, i do not know where to find an up to date documentation about basic Ruby keywords.