Bug #8052
closed"prepend Mod1, Mod2" behaves strangely
Description
I did some quick experiment with prepend and noticed a strange behavior.
"prepend B; prepend C" and "prepend B, C" produce same ancestors. However, their behaviors are different.
IMHO, "prepend B, C" should just insert B and C into ancestors array(or something equivalent) in the same order as appeared in code. Because 'prepend' is like inverse of 'include', it should work like "prepend C; prepend B". From this point of view the behavior I see with 'prepend B, C' in below code is a bug.
Please feel free to let me know if I misunderstood the feature.
Thanks,
Cao
(({
module B
def test
puts 'before B'
super
puts 'after B'
end
end
module C
def test
puts 'before C'
super
puts 'after C'
end
end
class A
prepend B
prepend C
def test
puts 'A'
end
end
class AA
prepend B, C
def test
puts 'AA'
end
end
puts "prepend B; prepend C => #{A.ancestors}\n\n"
A.new.test
puts "\n\nprepend B, C => #{A.ancestors}\n\n"
AA.new.test
END
prepend B; prepend C => [C, B, A, Object, Kernel, BasicObject]
before C
before B
A
after B
after C
prepend B, C => [C, B, A, Object, Kernel, BasicObject]
before B
before C
AA
after C
after B
}))
Updated by marcandre (Marc-Andre Lafortune) over 11 years ago
- Status changed from Open to Rejected
Your test has a bug. The last puts should use AA.ancestors
.
You would see that prepend B, C
is equivalent to prepend C; prepend B
(as per the documentation).
Updated by gcao (Guoliang Cao) over 11 years ago
My bad :-D
I was so excited that I found a bug in Ruby... just kidding.