2010-06-29 19 views
5

Esta pregunta trata sobre el formateo de las cadenas de ruby.Ruby version of to String method

En Python, las estructuras de datos incorporadas tienen incorporado un método de cadena, por lo que cuando se imprime una variable, la cadena se formatea convenientemente para que refleje la estructura de datos utilizada. Por ejemplo:

>>>$ 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] 

aviso de que al imprimir, el valor es [1, 2, 3, 4]

Sin embargo, en rubí, cuando trato de hacer las mismas cosas, me da este resultado:

>>>$ 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> 

Como puede ver, no hay formateo con el método to_s. Además, hay un problema de exclusividad si llamo a to_s en [1,2,3,4] y [1,23,4] y [1234] porque to_s agrupa todos los elementos para que todos terminen siendo "1234". Sé que puedo tratar de emular los métodos incorporados en cadena de python para cada estructura de datos nativa anulando el método to_s ("[" + a.join (",") + "]" #just para matrices), pero me preguntaba si existe una mejor alternativa, ya que piratearla parecería romper el concepto de convención sobre configuración.

Entonces, ¿hay un equivalente en rubí del método incorporado en la cadena de Python?

Respuesta

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

gotcha, eso está más cerca de lo que quería. Gracias. Leí a través de la API Array, pero no pude encontrar una solución para esto: ------------------------------ ---------------- irb (main): 002: 0> [1, 2, 3, 4, 'a', "b"] .inspect => "[ 1, 2, 3, 4, \ "a \", \ "b \"] " --------------------------- ------------------------- sería bueno no ver las barras invertidas. ¿es posible? – dzt

+0

imprimir [1,2,3,4, 'a', "b"] inspeccionar => [1,2,3,4, 'a', "b"] – Dogbert

+0

gracias Adam. Pero solo por curiosidad, ¿cómo conservaría el valor de la cadena con buen formato? cuando llamaste a imprimir, el valor de retorno es nulo, no la cadena formateada. – dzt

0

Uso inspeccionar

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> 
+0

gracias, pero ¿hay alguna forma de solucionar esto :::: [1,2,3,4,' a '," b "] .inspect =>" [1, 2, 3, 4, \ "a \", \ "b \"] "------- como en es posible no ver las barras diagonales inversas? – dzt

+0

Sí. Como muestro en mi ejemplo, (en IRB), use puts h.inspect, no h.inspect –

9

En Ruby, hay cuatro métodos que están normalmente disponibles para obtener una representación de cadena de un objeto.

  1. #to_str: esto es parte de los protocolos de Ruby estándar de conversión de tipo (similares a to_int, to_ary, to_float, y hellip;). Se utiliza si y solo si el objeto realmente realmente es una cadena pero por alguna razón no es una instancia de la clase String. Es extremadamente inusual De hecho, en toda la biblioteca principal, solo existe la implementación no operativa en la clase String.
  2. #to_s: esto también es parte de los protocolos de conversión de tipo estándar de Ruby (similar a to_i, to_a, to_f, & hellip;). Se usa si el objeto tiene algún tipo de representación de cuerda sensible. Realmente no necesita ser una cadena. Casi todos los objetos deberían responder a esto.
  3. Kernel#String(obj): esto también es parte de los protocolos de conversión de tipo estándar de Ruby (similar a Kernel#Integer(obj), Kernel#Array(obj), Kernel#Float(obj), & hellip;). Es lo mismo que obj.to_s.
  4. #inspect: se supone que devuelve una descripción legible por humanos del objeto con fines de depuración. En otras palabras: es para inspeccionar un objeto (duh).

Hay tres métodos para la impresión de objetos:

  1. Kernel#print(obj, ...): grabados todos obj s separadas por $, y terminados por $\.Si un obj no es un String, print llamará primero al obj.to_s.
  2. Kernel#puts(obj, ...): es básicamente equivalente a $stdout.puts(obj, ...). También imprime el obj s, pero normalmente los separa con líneas nuevas. Sin embargo, también tiene algún comportamiento de caso especial, en particular trata arreglos especialmente imprimiendo cada elemento en una nueva línea.
  3. Kernel#p(obj, ...): similar a puts pero llama #inspect en todos obj s.

Además de estos, también hay la biblioteca pp (bastante impresión) en la biblioteca estándar que añade un método Kernel#pp(obj, ...).

Luego, está la biblioteca awesome_print y hirb.

+0

Gracias, esto ayuda a aclarar muchas cosas. Gracias por presentar también a Hirb, esto funciona muy bien con la visualización de los modelos de registro activos de Rails. – dzt