Ruby版to String方法

5 投票
3 回答
6814 浏览
提问于 2025-04-16 00:35

这个问题是关于如何格式化Ruby中的字符串。

在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中,当我尝试做同样的事情时,得到的结果是:

>>>$ 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方法时没有任何格式化。此外,如果我对[1,2,3,4]、[1,23,4]和[1234]调用to_s方法,会出现一个独特性的问题,因为to_s会把所有元素都合并在一起,最后结果都是"1234"。我知道我可以通过重写to_s方法来模仿Python的内置字符串转换方法(比如对于数组可以用"[" + a.join(",") + "]"),但我在想有没有更好的办法,因为这样做似乎会破坏约定优于配置的原则。

那么,Ruby有没有类似于Python内置字符串转换方法的功能呢?

3 个回答

0

使用检查工具

irb(main):001:0> h = { "a" => "a", 1 => 5, 'b'=>'b' }
=> {"a"=>"a", "b"=>"b", 1=>5}
irb(main):003:0> puts h.inspect
{"a"=>"a", "b"=>"b", 1=>5}
=> nil
irb(main):004:0>
9

在编程中,有时候我们会遇到一些问题,尤其是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该如何解决。比如,有人可能在使用某个特定的功能时,发现它没有按照预期工作,或者出现了错误信息。这时候,我们就需要去查找解决方案,看看别人是怎么处理类似问题的。

在社区网站,比如StackOverflow,很多人会分享他们遇到的问题和解决办法。通过这些讨论,我们可以学习到很多实用的技巧和经验,帮助我们更好地理解编程的各种细节。

总之,遇到问题时,不要慌张,先去查找资料,看看有没有人遇到过类似的情况,或者有没有解决方案可以参考。

[1,23,4].inspect #=> "[1, 23, 4]"
p [1,23,4] # Same as  puts [1,23,4].inspect
9

在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: 这个方法应该返回一个人类可读的对象描述,主要用于调试。换句话说,它是用来检查一个对象的。

除了这些,还有三种方法可以用来打印对象:

  1. Kernel#print(obj, ...): 这个方法会打印所有的obj,用$,分隔,并以$\结束。如果obj不是一个Stringprint会先调用obj.to_s
  2. Kernel#puts(obj, ...): 这个方法基本上等同于$stdout.puts(obj, ...)。它也会打印obj,但通常会用换行符分隔它们。不过,它还有一些特殊的行为,特别是对数组的处理,会把每个元素打印在新的一行。
  3. Kernel#p(obj, ...): 这个方法和puts类似,但会对所有的obj调用#inspect

除了这些,还有一个标准库中的pp(漂亮打印)库,它增加了一个Kernel#pp(obj, ...)方法。

另外,还有awesome_print库和hirb

撰写回答