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中字符串转换的一些常见方法,还有其他更多的方法可供探索和使用。如果大家有更多的问题可以留言讨论。

相关推荐
腾讯TNTWeb前端团队5 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰9 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy10 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom10 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom10 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom11 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom11 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试