Ruby中的字符串转换方法

在Ruby中,你可以使用各种方法来转换字符串。下面是一些常用的方法,当然选择哪种适用的方法还得更具具体项目来做调整。日常使用中下面的错误也是比较常见的,看看我们怎么处理哈。

1、问题背景

在Python中,内置的数据结构都有一个内置的to-string方法,当打印一个变量时,字符串会被方便地格式化为反映所用的数据结构。例如:

python 复制代码
>>>$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
$>>> a = [1,2,3,4]
$>>> str(a)
'[1, 2, 3, 4]'
$>>> print a
[1, 2, 3, 4]
$>>> d = { "a":"a", "b":"b", 1:5 }
$>>> str(d)
"{'a': 'a', 1: 5, 'b': 'b'}"
$>>> print d
{'a': 'a', 1: 5, 'b': 'b'}
$>>> x = [1, 23, 4]
$>>> print x
[1, 23, 4]

请注意,当我打印a时,值是[1, 2, 3, 4]。

然而,在Ruby中,当我尝试做同样的事情时,我得到了这样的结果:

ruby 复制代码
>>>$ irb
irb(main):001:0> x = [1,23,4]
=> [1, 23, 4]
irb(main):002:0> x.to_s
=> "1234"
irb(main):003:0> puts x
1
23
4 
=> nil
irb(main):004:0> print x
1234=> nil
irb(main):005:0> h = { "a" => "a", 1 => 5, 'b'=>'b' } 
=> {"a"=>"a", "b"=>"b", 1=>5}
irb(main):006:0> print h 
aabb15=> nil
irb(main):007:0> h.to_s
=> "aabb15"
irb(main):008:0> puts h
aabb15
=> nil
irb(main):009:0>

如您所见,to_s方法没有格式化。此外,如果我调用to_s对[1,2,3,4]和[1,23,4]和[1234]进行比较,则存在唯一性问题,因为to_s将所有元素都聚集在一起,因此它们最终都变成"1234"。我知道我可以尝试通过覆盖to_s方法("[+ a.join(",") + ]" #仅适用于数组)来模拟Python内置的to-string方法,但我想知道是否有更好的选择,因为破解它似乎违反了convention-over-configuration的概念。

那么,有没有Ruby等价于Python的内置to-string方法?

2、解决方案

在Ruby中,通常有四种方法可用于获取对象的字符串表示形式。

**1、#to_str:**这是Ruby的标准类型转换协议的一部分(类似于to_int、to_ary、to_float、......)。仅当对象实际上确实是一个字符串但由于某种原因不是String类的实例时才使用它。它非常罕见。事实上,在整个核心库中,只有String类本身的空操作实现。

**2、#to_s:**这也是Ruby的标准类型转换协议的一部分(类似于to_i、to_a、to_f、......)。如果对象有一些合理的字符串表示,则使用它。它实际上不必是一个字符串。几乎所有对象都应该响应。

**3、Kernel#String(obj):**这也是Ruby的标准类型转换协议的一部分(类似于Kernel#Integer(obj)、Kernel#Array(obj)、Kernel#Float(obj)、......)。它与obj.to_s相同。

**4、#inspect:**它应该返回对象一个适用于调试目的的人类可读描述。换句话说:它是用于检查对象(duh)。

有三种方法用于打印对象:

**1、Kernel#print(obj, ...):**打印所有obj,用 ,分隔,并以 ,分隔,并以 ,分隔,并以,作为结尾。如果obj不是String,print将首先调用obj.to_s。

**2、Kernel#puts(obj, ...):**基本上等同于$stdout.puts(obj, ...)。它也打印obj,但通常使用换行符将它们分隔开。但是,它还有一些特殊情况的行为,特别是它通过在新行上打印每个项目来特殊处理数组。

**3、Kernel#p(obj, ...):**类似于puts,但对所有obj调用#inspect。

除了这些之外,标准库中还有pp(pretty print)库,它添加了一个Kernel#pp(obj, ...)方法。

然后,还有awesome_print库和hirb。

这些只是Ruby中字符串转换的一些常见方法,还有其他更多的方法可供探索和使用。如果大家有更多的问题可以留言讨论。

相关推荐
花嫁代二娃3 小时前
Linux:环境变量
linux
nbsaas-boot4 小时前
Java 正则表达式白皮书:语法详解、工程实践与常用表达式库
开发语言·python·mysql
乌托邦的逃亡者4 小时前
Docker的/var/lib/docker/目录占用100%的处理方法
运维·docker·容器
chao_7894 小时前
二分查找篇——搜索旋转排序数组【LeetCode】两次二分查找
开发语言·数据结构·python·算法·leetcode
ldj20204 小时前
Jenkins 流水线配置
运维·jenkins
一斤代码5 小时前
vue3 下载图片(标签内容可转图)
前端·javascript·vue
风无雨5 小时前
GO 启动 简单服务
开发语言·后端·golang
中微子5 小时前
React Router 源码深度剖析解决面试中的深层次问题
前端·react.js
光影少年5 小时前
从前端转go开发的学习路线
前端·学习·golang
斯普信专业组5 小时前
Go语言包管理完全指南:从基础到最佳实践
开发语言·后端·golang