我正在使用一个ruby应用程序,其中符号用于各种地方,其中通常使用其他语言的字符串或枚举(主要指定配置)。
所以我的问题是,为什么我不将to_str方法添加到符号?
似乎合情合理,因为它允许在符号和字符串之间进行隐式转换。所以我可以做这样的事情,而不必担心调用:symbol.to_s:
File.join(:something, "something_else") # => "something/something_else"
否定与正面相同,它隐含地将符号转换为字符串,如果它导致一个模糊的错误,这可能真的令人困惑,但鉴于如何使用符号,我不确定这是否是一个有效的关注点
有什么想法吗?
答案 0 :(得分:2)
您不必隐式转换它吗?因为做这样的事情会自动将它强制转换为字符串。
"#{:something}/something_else" # "something/something_else"
答案 1 :(得分:2)
当一个对象respond_to? :to_str
时,你希望他真的像String
那样行事。这意味着它应该实现所有的String
方法,因此您可能会破坏依赖于此的一些代码。
to_s
意味着您获得了对象的字符串表示,这就是为什么这么多对象实现它的原因 - 但是你获得的字符串远非“语义上”等同于你的对象(an_hash.to_s远非Hash
)。 :symbol.to_str
的缺席反映了这一点:符号不是并且不能与Ruby中的字符串混淆,因为它们用于完全不同的目的。
您不会考虑将to_str
添加到Int,对吗?然而,Int与符号有很多共同之处:每一个都是独一无二的。当你有一个符号时,你希望它也是唯一且不可变的。
答案 2 :(得分:1)
否定就是你所说的 - 无论如何,一些核心Ruby基于符号/字符串有不同的行为。我不知道是否仍然如此。仅威胁让我有点抽搐,但此时我没有坚实的技术理由。我想让符号更像字符串的想法让我感到紧张。