将一个to_str方法添加到Symbol有什么负面影响?

时间:2011-11-08 23:45:32

标签: ruby-on-rails ruby symbols

我正在使用一个ruby应用程序,其中符号用于各种地方,其中通常使用其他语言的字符串或枚举(主要指定配置)。

所以我的问题是,为什么我将to_str方法添加到符号?

似乎合情合理,因为它允许在符号和字符串之间进行隐式转换。所以我可以做这样的事情,而不必担心调用:symbol.to_s:

File.join(:something, "something_else") # => "something/something_else"

否定与正面相同,它隐含地将符号转换为字符串,如果它导致一个模糊的错误,这可能真的令人困惑,但鉴于如何使用符号,我不确定这是否是一个有效的关注点

有什么想法吗?

3 个答案:

答案 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基于符号/字符串有不同的行为。我不知道是否仍然如此。仅威胁让我有点抽搐,但此时我没有坚实的技术理由。我想让符号更像字符串的想法让我感到紧张。