Какой механизм используется, чтобы позволить вызывать методы, определенные в корневой области ruby, из этой области? - PullRequest
4 голосов
/ 07 мая 2011

В ruby, когда определяется метод в корневой области, его можно вызвать из этой области:

def foo
  "foo"
end
foo #=> "foo"

В любом другом контексте это не так:

class Bar
  def foo
    "foo"
  end
  foo #=> Error: No Method `foo` for class Bar
end

Какой механизм используется при настройке объекта main (экземпляр Object), который позволяет этому происходить?

Ответы [ 3 ]

5 голосов
/ 07 мая 2011

Это действительно особый случай в Ruby. Если вы определяете методы в глобальной области видимости, они фактически определяются на Kernel, который включен в каждый объект по умолчанию.

Ядро также существует, когда никакой другой контекст не определен. Поскольку Class наследует также от определенных в нем методов ядра, они также находятся в области видимости классов.

1 голос
/ 09 мая 2011

Просто чтобы подтвердить то, что сказал Якуб Хэмпл:

def foo
  "Debugging: self is #{self.inspect}"
end
foo # => "Debugging: self is main"

class Bar
  def goo
    foo
  end
end

Bar.new.goo # => "Debugging: self is #<Bar:0x1513cc0>"
0 голосов
/ 07 мая 2011

Вы должны определить его как метод класса (self) вместо метода экземпляра

class Bar
  def self.foo
    "foo"
  end
  foo 
  #=> "foo"
end
...