gpt4 book ai didi

ruby - 如何继承NilClass或者如何模拟类似的功能

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:03 26 4
gpt4 key购买 nike

我只想使用空对象设计模式,但我发现我可以从 NilClass 继承。

我可以写一个方法“nil?”并返回 false 但如果用户在下面编写代码怎么办

if null_object 
puts "shouldn't be here"
end

为了澄清我尝试做的是:

record = DB.find(1)
# if it can not find record 1, the bellow code should not raise exception
record.one_attr
# and what's more
if record
puts "shouldn't be here"
end
# I don't want to override all NilClass

最佳答案

一种可能对您有用的方法是覆盖方法#nil?在你的 Null 对象中。这意味着在您的代码中测试 null 必须使用 obj.nil?而不仅仅是检查 obj 是否存在。这可能是合理的,因为您可以区分 nil 和 null。下面是一个例子:

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

[为简洁起见删除了测试]

使用风险自负。我还没有研究这可能会导致什么副作用,或者它是否会做你想做的事。但它似乎确实有一些类似 nil 的行为

关于ruby - 如何继承NilClass或者如何模拟类似的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5243238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com