2010-02-27 11 views

Respuesta

7

Puede desactivar este tipo de comportamiento con shell:strings/1 function comenzando con Erlang R16b.

Solo recuerde que esta es una opción global para todos los shells de nodos, y que podría ser una buena idea volver atrás cuando termine de reproducirse el shell en los nodos vivos más largos.

19

No sé si es posible cambiar el comportamiento predeterminado del shell, pero al menos puede formatear su salida correctamente, usando io:format.

Aquí se muestra un ejemplo:

1> io:format("~p~n", [[65, 66, 67]]). 
"ABC" 
ok 
2> io:format("~w~n", [[65, 66, 67]]). 
[65,66,67] 
ok 

Y puesto que el depósito es sólo para experimentar/mantenimiento, io:format() debería ser al menos suficiente para su aplicación real. Quizás también deba considerar escribir su propio método de formato/impresión, p. formatPerson() o algo así, que formatea todo muy bien.

+0

Sé sobre io: format y probablemente debería haberlo mencionado en la pregunta :) –

+0

Esto es exactamente lo que estaba buscando cuando necesitaba imprimir una lista de enteros como una cadena. ¡Gracias! – Matt

0

El problema es que la cadena no es un tipo en Erlang. Una cadena es solo una lista de enteros, por lo que no hay forma de que el shell distinga una cadena imprimible de una lista genérica. No sé si esta respuesta a su pregunta.

+0

Intenta ingresar '[65,66,67] .' y' [1,2,3] .' a tu caparazón ... – Zed

+0

@Zed: era consciente de eso. Pero creo que he entendido mal la pregunta. Ahora tengo lo que está tratando de hacer. Gracias. –

7

Tiendo a hacerlo anteponiendo un átomo a mi lista en el caparazón.

por ejemplo:

Eshell V5.7.4 (abort with ^G) 
1> [65,66,67]. 
"ABC" 
2> [a|[65,66,67]]. 
[a,65,66,67] 

también podría ser [a, 65,66,67], por supuesto. pero [a | fun_that_returns_a_list()] imprimirá "lo correcto (ish) la mayor parte del tiempo"

2

No, no hay forma de deshabilitarlo. La mejor alternativa que encuentro es imprimir explícitamente el valor en la consulta (con io:format) o después de hacerlo: io:format("~w\n", [v(-1)]).

1

No creo que pueda evitarlo. Anular un átomo parece un error: altera la cadena original.

Normalmente utilizo listas: flatten (String) para forzarlo a una cadena, especialmente el valor de retorno de io_lib: format() no siempre se imprime como una cadena. Usar listas: aplanar() lo convierte en uno.

utilizo el siguiente "estilo C":

sprintf(Format) -> 
    sprintf(Format, []). 
sprintf(Format, Args) -> 
    lists:flatten(io_lib:format(Format, Args)). 
5

As of Erlang/OTP R16B, puede utilizar la función shell:strings/1 convertir esta encendido o apagado. Tenga en cuenta que también afecta a la impresión de las cosas que realmente están destinados a ser cadenas, tales como "foo" en el siguiente ejemplo:

1> {[8,9,10], "foo"}. 
{"\b\t\n","foo"} 
2> shell:strings(false). 
true 
3> {[8,9,10], "foo"}. 
{[8,9,10],[102,111,111]} 
Cuestiones relacionadas