to-String方法的Ruby版本

2024-09-26 22:43:26 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是关于格式化ruby的字符串。

在Python中,内置的数据结构有一个内置的to-string方法,因此在打印变量时,字符串的格式可以方便地反映所使用的数据结构。例如:

>>>$ 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]上的tou s,则存在唯一性问题,因为tou将所有元素聚集在一起,因此它们最终都是“1234”。我知道,我可以通过重写to_s方法(“[”+a.join(“,”)+“]”(仅对于数组),尝试为每个本机数据结构模拟python内置的to-string方法,但我想知道是否有更好的替代方法,因为黑客攻击似乎会打破配置概念的约定。

那么,有没有一个ruby等价于python的内置到字符串的方法呢?


Tags: to方法字符串数据结构stringmain内置ruby
3条回答

使用检查

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>
[1,23,4].inspect #=> "[1, 23, 4]"
p [1,23,4] # Same as  puts [1,23,4].inspect

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

  1. #to_str:这是Ruby标准类型转换协议的一部分(类似于to_intto_aryto_float,…)。如果和仅当对象实际上是一个字符串,但由于任何原因不是String类的实例时才使用。这是极不寻常的。实际上,在整个核心库中,String类本身只有no-op实现。
  2. #to_s:这也是Ruby标准类型转换协议的一部分(类似于to_ito_ato_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, ...)。它还打印objs,但通常用新行分隔它们。但是,它也有一些特殊的case行为,特别是它通过在新行上打印每个项来特别处理数组。
  3. Kernel#p(obj, ...):类似于puts,但对所有objs调用#inspect

除此之外,标准库中还有pp(漂亮的打印)库,它添加了Kernel#pp(obj, ...)方法。

然后是awesome_print库和hirb

相关问题 更多 >

    热门问题