Подход, который может работать для вас, состоит в том, чтобы переопределить метод #nil?в вашем нулевом объекте.Это означает, что в вашем коде для проверки на null вы должны использовать obj.nil?а не просто проверить наличие объекта.Это, вероятно, разумно, так как вы можете различить ноль и ноль.Ниже приведен пример:
class NullClass
def nil?
true
end
def null_behavior
puts "Hello from null land"
end
end
Наследование будет работать:
class NewClass < NullClass
end
Использовать так:
normal = Class.new
null = NewClass.new
x = [normal, null]
x.each do |obj|
if obj.nil?
puts "obj is nil"
obj.null_behavior
end
end
Вывод:
obj is nil
Hello from null land
Просто не забудьте использовать # .nil?для любых проверок, которые требуют, чтобы Null и Nil были ложными.
Ниже этой строки был мой НЕПРАВИЛЬНЫЙ начальный ответ
CustomNil = Class.new(NilClass)
class CustomNil
def self.new
###!!! This returns regular nil, not anything special.
end
end
[тесты удалены для краткости]
Использоватьна свой страх и риск.Я не исследовал, какие побочные эффекты это может вызвать или будет ли это делать то, что вы хотите.Но, похоже, у него есть ноль как поведение