Метод, объявленный, примыкает, класс включен автоматически?

Кто-то может помочь мне понять следующее? У меня есть следующий код в 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 существуйте в экземпляре Собаки даже при том, что он объявляется за пределами класса? Поскольку это находится в том же файле?Спасибо!

5
задан penger 19 February 2010 в 20:34
поделиться

2 ответа

Когда вы создаете метод в «глобальной» области (вне любого класса), этот метод становится закрытым методом 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!"
3
ответ дан 15 December 2019 в 00:59
поделиться

Ваш точный пример не работает в Ruby 1.9. (Помимо плохого синтаксиса комментариев.)

Однако объявление метода в области верхнего уровня сделает его частным методом для объекта , по-видимому:

>> Object.private_methods.include? :bark
=> true

Возможно, в вашем Ruby (1.8?) , это общедоступный метод?

1
ответ дан 15 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: