在Ruby中to_s与to_str的比较?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (92)

我正在学习Ruby,并且我看到了一些让我感到困惑的方法,尤其是to_sto_str(和to_i/ to_intto_a/ to_ary,&to_h/ to_hash)。我读过的内容解释说,较短的形式(例如to_s)用于显式转换,而较长的形式用于隐式转换。

我真的不知道如何to_str实际使用。字符串以外的东西会定义to_str吗?能给这个方法的实际应用吗?

提问于
用户回答回答于

首先注意,所有这些都适用于Ruby中的每对“short”(例如to_s/ to_i/ to_a/ to_h)与“long”(例如to_str/ to_int/ to_ary/ to_hash)强制方法(它们各自的类型),因为它们都具有相同的语义。

它们有不同的含义。你不应该执行to_str,除非你的对象的行为就像一个字符串,而不是仅仅是表示的一个字符串。唯一实现的核心类to_str是String本身。

用户回答回答于

要理解你是否应该使用/实现to_s/ to_str,我们来看一些例子

1.to_s              # returns "1"
Object.new.to_s     # returns "#<Object:0x4932990>"
1.to_str            # raises NoMethodError
Object.new.to_str   # raises NoMethodError

正如我们所看到的,to_s很高兴将任何对象转换为字符串。另一方面,当参数看起来不像字符串时to_str 会引发错误

现在让我们看看Array#join

[1,2].join(',')     # returns "1,2"
[1,2].join(3)       # fails, the argument does not look like a valid separator.

Array#join在加入数组之前,将数组中的项(不管它们的真实属性)转换为字符串是非常有用的,因此可以Array#join调用to_s它们。

然而,分隔符应该是一个字符串 - 有人调用[1,2].join(3)可能会犯一个错误。这就是为什么要在分隔符上Array#join调用to_str

其他方法似乎也适用同样的原则。考虑to_a/ to_ary

{1,2}.to_a      # returns [[1, 2]], an array that describes the hash
{1,2}.to_ary    # fails, because a hash is not really an array.

总之,以下是我的看法:

  • 调用to_s 以获取描述对象的字符串。
  • 调用to_str来验证一个对象真的像一个字符串。
  • to_s当你可以建立一个描述你的对象的字符串时实现。
  • to_str当你的对象可以像字符串一样行为时实现。

扫码关注云+社区