Когда вы создаете метод в «глобальной» области видимости (вне какого-либо класса), этот метод становится закрытым методом объекта:
#!/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
Объект находится в цепочке предков всех объектов,включая Собаку:
dog = Dog.new
p dog.class.name # => "Dog"
p dog.class.superclass.name # => "Object"
Поэтому собаки (да и вообще все предметы) теперь умеют лаять.Однако, поскольку метод является закрытым, вам придется использовать instance_eval для вызова его с явным получателем:
dog.instance_eval { bark } # => "Woof!"
Или вы можете вызвать его с неявным получателем без необходимости гимнастики:
bar # => "Woof!"