gpt4 book ai didi

ruby - 只是为了好玩 - 我可以为特定用途编写自定义 NilClass 吗?

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

编辑 |或者另一个关于同一object 主题的问题。我可以编写自己的类定义来使以下所有内容正常工作吗?

o = WeirdObject.new
puts "Object o evaluates as true in boolean expressions" if o # Line never output
puts "Object o is nil?" if o.nil? # Line is output

我可以轻松完成 nil? 操作,因为那只是一种方法。但是不知道如何让它在 bool 表达式(包括最基本的表达式“o”)中评估为非真值。

原始问题如下...

更多的是出于好奇,我真的可以从 Ruby (1.9.2) 中获得多少乐趣......

当用户未登录时,我希望能够使用 unless @user 或 unless @user.nil? 等检测到它,但是在同时,我希望能够在此对象上调用 User 的方法并让它们返回相同的 NilClass(ala Objective-C),因为在大多数地方这将消除对样板 if @user 代码的需要,同时在 bool 表达式中仍然表现得像 nil

我看到你不能继承 NilClass,因为它没有 #new 方法。您可以直接向实例添加方法,但它是一个单例,因此如果我只想观察此行为的地方是未登录的用户,这会导致问题。

这可能吗?

我的意思是,是这样的:

class CallableNil < NilClass
def method_missing(meth, *args, &block)
self
end
end

user = CallableNil.new # or .singleton, or something

puts "Got here" unless user # Outputs
puts "And here" unless user.nil? # also outputs

puts user.username # no-op, returns nil

这基本上就是 Objective-C 处理 nil 的方式,它在某些情况下很有用。

我想我不能子类化 NilClass 而只是实现会导致它在 bool 表达式中为 false 的方法?

编辑 |哈哈,如果你重新定义顶级 NilClass,你真的会严重破坏 Ruby...它根本停止响应任何方法调用。

>> class NilClass
>> def method_missing(meth, *args, &block)
>> self
>> end
>> end
>>
?> nil.foo
>>
?>
?> puts "here"
>> quit
>> # WTF? Close dammit!

最佳答案

如果您的主要要求是能够在 nil 值上调用方法而不引发异常(或必须检查它是否已定义),ActiveSupport 添加 Object#try,它使您能够做到这一点:

instance = Class.method_that_returns_nil

unless instance
puts "Yes, we have no instance."
end

instance.try(:arbitrary_method) # => nil
instance.try(:arbitrary_method, "argument") # => nil

如您所见,随意使用 NilClass 会产生一些有趣的副作用。

关于ruby - 只是为了好玩 - 我可以为特定用途编写自定义 NilClass 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925234/

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