为什么在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
方法的对象。