为什么在Ruby中没有将nil转换为符号?

为什么在Ruby中没有将nil转换为符号?,ruby,Ruby,考虑到nil.to\u s是一个空字符串'和:''。to\u s也是一个空字符串,我不禁想知道为什么nil.to\u sym会给出一个错误。在我看来,合乎逻辑的是,nil.to_sym将给出一个空符号:“。我是否遗漏了什么,或者这可能是NilClass扩展中有用的一点?直到最近,符号与字符串不同,不能被垃圾收集,因此人们必须更加小心地从一些随机对象生成符号。当其库存预定时,使用符号;它不应该用来表示一个开放的对象范围 最近,引入了符号的垃圾收集,但您仍然不需要nil.to_sym;如果您的目的只

考虑到
nil.to\u s
是一个空字符串
'
:''。to\u s
也是一个空字符串,我不禁想知道为什么
nil.to\u sym
会给出一个错误。在我看来,合乎逻辑的是,
nil.to_sym
将给出一个空符号
:“
。我是否遗漏了什么,或者这可能是NilClass扩展中有用的一点?

直到最近,符号与字符串不同,不能被垃圾收集,因此人们必须更加小心地从一些随机对象生成符号。当其库存预定时,使用符号;它不应该用来表示一个开放的对象范围

最近,引入了符号的垃圾收集,但您仍然不需要
nil.to_sym
;如果您的目的只是安全地应用symbol类的实例方法,那么您不需要首先将其转换为符号,因为您可以在其上使用安全导航操作符

foo&.some_symbol_method

毫无疑问,Matz会问:用例是什么?sawa f.e.case将某物切换到某物可能为零的情况。我真的不在乎这里是否为零。使用
nil.to_s.to_sym
我知道,
&.
操作符基本上是Rails的语法糖
try
方法?它不相同。它只在
nil
上运行,不在
false
上运行
false。try(:upcase)
将返回nil,但
false&.upcase
将引发未定义的方法。另外,如果对象不是nil但没有这样的方法,
try
(与
try!
)将返回nil<代码>“hello”。try(:odd?返回nil,
“hello”和.odd?
引发未定义的方法因此
&。
try
不同,是不可链接的?谢谢,这很有帮助,“它不应该用来表示一个开放的对象范围”-但我们这里只讨论一个对象-NilClass的唯一实例,所以我看不出这会如何影响垃圾收集/内存消耗。什么?Ruby核心库中正好有两种
to_sym
实现:
Symbol#to_sym
(标识方法)和
String#to_sym
。恰恰相反:根据您的建议,
nil
几乎是唯一一个使用
to_sym
方法的对象。