Метод, объявленный вне класса, включается автоматически? - PullRequest
5 голосов
/ 19 февраля 2010

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

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010

Когда вы создаете метод в «глобальной» области видимости (вне какого-либо класса), этот метод становится закрытым методом объекта:

#!/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!"
1 голос
/ 19 февраля 2010

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

Однако объявление метода в области верхнего уровня сделает его закрытым методом на Object, по-видимому:Ruby (1.8?), Это публичный метод?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...