我正在学习Ruby,我看到了一些让我有点困惑的方法,尤其是to_s
对to_str
(类似地,to_i
/to_int
、to_a
/to_ary
和to_h
/to_hash
).我所读到的解释是,较短的形式(例如to_s
)用于显式转换,而较长的形式用于隐式转换.
我真的不明白to_str
是怎么用的.除了字符串之外,还有什么东西能定义to_str
吗?你能给出这种方法的实际应用吗?
我正在学习Ruby,我看到了一些让我有点困惑的方法,尤其是to_s
对to_str
(类似地,to_i
/to_int
、to_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
,除非你的对象acts像一个字符串,而不仅仅是一个字符串的representable.实现to_str
的唯一核心类是字符串本身.
摘自Programming Ruby(引自this blog post,值得一读):
[
to_i
和to_s
]并不是特别严格:例如,如果一个对象有某种像样的字符串表示,它可能会有一个to_s
方法……[to_int
和to_str
]是严格的转换函数:只有在[your]对象可以自然地用于字符串或整数的每个位置时,才能实现它们.
Older Ruby documentation from the Pickaxe有这样一句话:
与几乎所有类都支持的
to_s
不同,to_str
通常只由那些行为类似字符串的类实现.
例如,除了Integer,Float和;Numeric实现to_int
(to_i
相当于to_str
),因为它们都可以很容易地替换为整数(它们实际上都是数字).除非类与字符串有类似的紧密关系,否则不应该实现to_str
.