Что здесь произошло? (ноль в рубине) - PullRequest
0 голосов
/ 02 сентября 2010
p parent.class #=> NilClass # ok.
p !!parent # => false # as expected.
p parent.object_id # => 17006820 # should be 4
p parent && parent.foo # => NoMethodError foo # should be nil-guarded

Откуда этот объект?

1 Ответ

2 голосов
/ 02 сентября 2010

Возможно, что-то вроде этого:

class BlankSlate
  instance_methods.each do |m|
    # Undefine all but a few methods. Various implementations leave different
    # methods behind.
    undef_method(m) unless m.to_s == "object_id"
  end
end

class Foo < BlankSlate
  def method_missing(*args)
    delegate.send(*args)
  end

  def delegate
    # This probably contains an error and returns nil accidentally.
    nil
  end
end

parent = Foo.new

p parent.class
#=> NilClass

p !!parent
#=> false

p parent.object_id
#=> 2157246780

p parent && parent.foo
#=> NoMethodError: undefined method `foo' for nil:NilClass

Создание BlankSlate или BasicObject - это обычный шаблон (до того, как он был добавлен в ядро ​​Ruby начиная с версии 1.9).Он служит для создания объектов, которые будут делать что-то особенное с любым отправляемым им методом или в значительной степени делегировать свое поведение другому классу.Недостатком является то, что это может привести к странному поведению, как это.

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