Кто-то может помочь мне понять следующее? У меня есть следующий код в test.rb:
class Dog
end
// bark is declared outside of Dog class
def bark
puts 'Woof!'
end
затем в irb:
>> source 'test.rb'
>> a = Dog.new
=> #<Dog:0x117f614>
>> a.bark
Woof!
=> nil
Почему делает метод bark
существуйте в экземпляре Собаки даже при том, что он объявляется за пределами класса? Поскольку это находится в том же файле?Спасибо!
Когда вы создаете метод в «глобальной» области (вне любого класса), этот метод становится закрытым методом Object:
#!/usr/bin/ruby1.8
class Dog
end
p Object.respond_to?(:bark, true) # => false
def bark
puts "Woof!"
end
p Object.respond_to?(:bark, true) # => true
Object входит в цепочку предков всех объектов, включая Dog:
dog = Dog.new
p dog.class.name # => "Dog"
p dog.class.superclass.name # => "Object"
Следовательно, собаки (и вообще все объекты) теперь умеют лаять. Однако, поскольку метод является частным, вам придется использовать instance_eval, чтобы вызвать его с явным получателем:
dog.instance_eval { bark } # => "Woof!"
Или вы можете вызвать его с неявным получателем без какой-либо гимнастики:
bar # => "Woof!"
Ваш точный пример не работает в Ruby 1.9. (Помимо плохого синтаксиса комментариев.)
Однако объявление метода в области верхнего уровня сделает его частным методом для объекта
, по-видимому:
>> Object.private_methods.include? :bark
=> true
Возможно, в вашем Ruby (1.8?) , это общедоступный метод?