这个问题是关于格式化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]
Run Code Online (Sandbox Code Playgroud)
请注意,当我打印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>
Run Code Online (Sandbox Code Playgroud)
如您所见,to_s方法没有格式化.此外,如果我在[1,2,3,4]和[1,23,4]和[1234]上调用to_s,则存在唯一性问题,因为to_s将所有元素组合在一起,因此它们最终都是"1234".我知道我可以尝试通过覆盖to_s方法("["+ a.join(",")+"]"#just for arrays)来模拟每个本机数据结构的python内置to-string方法,但我想知道是否有一个更好的选择,因为黑客它似乎打破了惯例超过配置的概念.
那么有一个ruby相当于python的内置to-string方法吗?
[1,23,4].inspect #=> "[1, 23, 4]"
p [1,23,4] # Same as puts [1,23,4].inspect
Run Code Online (Sandbox Code Playgroud)
在Ruby中,有四种方法通常可用于获取对象的字符串表示.
#to_str:这是Ruby的标准类型转换协议的一部分(类似to_int,to_ary,to_float,...).当且仅当对象确实是一个字符串但是由于某种原因不是String该类的实例时才使用它.这是非常不寻常的.事实上,在整个核心库中,String类本身只有no-op实现.#to_s:这也是Ruby的标准类型转换协议的一部分(类似to_i,to_a,to_f,...).如果对象具有某种合理的字符串表示,则使用它.它实际上不需要是一个字符串.几乎所有对象都应该响应这一点.Kernel#String(obj):这也是Ruby的标准类型转换协议的一部分(类似Kernel#Integer(obj),Kernel#Array(obj),Kernel#Float(obj),...).它是一样的obj.to_s.#inspect:它应该返回对象的人类可读描述以进行调试.换句话说:它用于检查物体(duh).打印对象有三种方法:
Kernel#print(obj, ...):打印所有objs分隔$,和终止$\.如果a obj不是a String,print将obj.to_s首先调用.Kernel#puts(obj, ...):基本相当于$stdout.puts(obj, ...).它还打印objs,但它通常用换行符分隔它们.但是,它也有一些特殊的行为,特别是它通过在新行上打印每个项目来处理数组.Kernel#p(obj, ...):类似puts但是呼唤#inspect所有obj的.除此之外,pp标准库中还有(漂亮的)打印库,它添加了一个Kernel#pp(obj, ...)方法.
然后,有awesome_print图书馆和hirb.
| 归档时间: |
|
| 查看次数: |
6509 次 |
| 最近记录: |