Bug #11980
closed
External methods are appearing as instance methods for String
Added by danielpclark (Daniel P. Clark) almost 9 years ago.
Updated over 5 years ago.
Description
It appears we're having methods creep into the String scope.
"".methods.count
# => 170
defined? "".a
# => nil
def a
"foo"
end
"".methods.count
# => 171
defined? "".a
# => "method"
"bar".a
# => "foo"
It's not just String.
Array.instance_method(:a).owner
# => Object
Those results were from IRB. Here's my results from a Ruby script.
"test_scope_creep.rb"
puts "".methods.count
puts defined? "".a
def a
"foo"
end
puts "".methods.count
puts defined? "".a
puts String.private_method_defined? :a
puts String.instance_method(:a).owner
puts "".send :a
puts Array.private_method_defined? :a
puts Array.instance_method(:a).owner
puts [].send :a
Output:
170
170
true
Object
foo
true
Object
foo
It appears they are defined as private methods when run via ruby
and in irb
they run like they're not private methods.
It's not really a bug.
When you define following method. It is added on Object class. And any class which inherits from Object class will have following method.
You can try calling following method on any class which inherits Object class, you should get same output.
def a
"foo"
end
- Status changed from Open to Closed
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0