我正在学习Ruby,我看到了一些让我有点困惑的方法,尤其是to_sto_str(类似地,to_i/to_intto_a/to_aryto_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_ito_s]并不是特别严格:例如,如果一个对象有某种像样的字符串表示,它可能会有一个to_s方法……[to_intto_str]是严格的转换函数:只有在[your]对象可以自然地用于字符串或整数的每个位置时,才能实现它们.

Older Ruby documentation from the Pickaxe有这样一句话:

与几乎所有类都支持的to_s不同,to_str通常只由那些行为类似字符串的类实现.

例如,除了IntegerFloat和;Numeric实现to_int(to_i相当于to_str),因为它们都可以很容易地替换为整数(它们实际上都是数字).除非类与字符串有类似的紧密关系,否则不应该实现to_str.

Ruby相关问答推荐

根据部分已知值判断数组内容的简洁 Rubyist 方法是什么?

Ruby - 将两个哈希与一些相似的键合并

回声ABC | ruby -p -e "sub('a','A').sub('b', 'B')": 为什么不是 "ABc"?

Ruby 按变量条件划分数组数组

ri 和 rdoc 有什么区别

Ruby $:.unshift File.dirname(__FILE__)

为什么在 Ruby 中将 0 视为 True?

是否有Ruby单行如果 x 则返回?

为 Ruby 模块中的每个方法调用执行代码

Ruby 的排序方法使用哪种算法?

Ruby字符串上的扫描和匹配有什么区别

Unexpected Return (LocalJumpError)

理解 Ruby 中的私有方法

用 Ruby 解析 XML

map、each 和 collect 有什么区别?

工厂女孩 - 目的是什么?

Ruby总是Round Up

如何在器上下文中运行 ruby​​ 脚本?

如何在 Rails 应用程序中使用 httparty 的基本身份验证?

如何使用 Ruby 删除回车?