В чем разница между Object и BasicObject в Ruby? - PullRequest
39 голосов
/ 17 января 2012

В чем разница между этими классами? В чем разница между их целями?

1 Ответ

57 голосов
/ 17 января 2012

BasicObject был введен в Ruby 1.9 и является родителем Object (таким образом BasicObject является родительским классом всех классов в Ruby).

BasicObject почти не имеет методов:

::new
#!
#!=
#==
#__id__
#__send__
#equal?
#instance_eval
#instance_exec

BasicObject может использоваться для создания иерархий объектов, независимых от Объектная иерархия Ruby, прокси-объекты, такие как класс Delegator, или другое использование, где загрязнение пространства имен от методов и классов Руби следует избегать.

BasicObject не включает ядро ​​(для таких методов, как put) и BasicObject находится за пределами пространства имен стандартной библиотеки, поэтому общие классы не будут найдены без использования полного пути к классам.


Объект смешивается в модуле Kernel, делая встроенное ядро функции доступны во всем мире. Хотя методы экземпляра объекта определяются модулем ядра ...

Вы можете использовать BasicObject в качестве родителя вашего объекта в случае, если вам не нужны методы Object, и вы бы определили их иначе:

# when you inherit Object
class Tracer
  instance_methods.each do |m|
    next if [:__id__, :__send__].include? m
    undef_method m
  end

  # some logic
end

# when you inherit BasicObject
class Tracer < BasicObject
  # some logic
end
...