我正在学习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相关问答推荐

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

Docker for Mac - mkmf.rb 找不到 ruby​​ 的头文件

Ruby 无法加载此类文件 - active_support/core_ext/object/blank

如何只获取没有命名空间的类名

如何从 Gemfile 安装 gem?

如何在 macOS 上卸载 rbenv?

如何从 Ruby HEREDOC 中删除前导空格字符?

gem eventmachine 致命错误:找不到“openssl/ssl.h”文件

使用 bundler 安装较新版本的 bundler

如何在控制台中禁用 MongoDB 日志(log)消息?

ruby 中 `not` 和 `!` 之间的区别

如何解决 RVM 安装过程中的“gpg: command not found”错误?

类似查询的安全 ActiveRecord

Ruby总是Round Up

如何调试/显示使用 RestClient 发送的请求

退出(exit)和中止(abort)有什么区别?

Ruby:从 Ruby 中的变量创建哈希键和值

为什么“compass watch”说它无法加载 sass/script/node (LoadError)?

如何通过拆分字符的最后一次出现将字符串拆分为仅两部分?

如何在加载文件时禁用重新定义常量的警告