Ruby中的字符串转换方法

2024-05-09 12:56:08 浏览数 (1)

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

1、问题背景

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

代码语言:javascript复制
>>>$ 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中,当我尝试做同样的事情时,我得到了这样的结果:

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

0 人点赞