2015-02-21 18 views
9

Ecco il programma che sto cercando di correre per Elixir 1.0.3:stampa di base con Elixir - IO.puts errore: ** (ArgumentError) Errore di argomento (stdlib): io.put_chars (#PID

IO.puts "putstest" 

div2 = fn inputnum -> 
    [:a, inputnum/4, inputnum/7, inputnum/5.0, inputnum/7, inputnum*88] 
end 

myoutput = div2.(300.0) 

IO.puts myoutput 

ho aggiunto il: un atomo in caso Elixir stava facendo una sorta di fusione implicita

sono una specie di nuovo da Elixir continuo a ricevere il seguente errore quando si esegue il codice di cui sopra per $ elixir putztestzorz.exs:..

putstest 
** (ArgumentError) argument error 
    (stdlib) :io.put_chars(#PID<0.24.0>, :unicode, [[:a, 75.0, 42.857142857142854, 60.0, 42.857142857142854, 2.64e4], 10]) 
    (elixir) lib/code.ex:316: Code.require_file/2 

I controllato la documentazione allo http://elixir-lang.org/docs/master/elixir/IO.html, ma né IO.stream (Converte il dispositivo io in un IO.Stream, modificato l'ultima riga in IO.stream output) né IO.write (Scrive l'argomento specificato sul dispositivo specificato, modificato l'ultimo linea a IO.write :stdout, output) sembra fare il trucco.

Non voglio continuare a indovinare, qui, e sembra che non capisco cosa dovrebbe fare la funzione.

Esiste un analogo a Python print() che funziona, ,?

Devo trasmettere l'elenco o qualcosa del genere?

Probabilmente mi manca qualcosa di veramente semplice, qui, ma non voglio solo indovinare la mia lista di funzioni di gestione degli I/O.

(PS La documentazione continua a parlare di un Process.group_leader. Non ho intenzione di fare molto con questo ancora, ma c'è un modo per metterlo in contesto per questo genere di cose? Continuo a immaginare Red Leader da Star Wars.)

risposta

14

Il problema è che IO.puts non può gestire elenchi arbitrari, quindi lo ArgumentError. L'unico tipo di elenco che può gestire sono elenchi di caratteri o stringhe tra virgolette singole. Questo è il motivo per cui la funzione corrisponde correttamente all'argomento della lista, ma successivamente esplode in profondità all'interno della libreria. Fondamentalmente avete due alternative:

Utilizzare IO.inspect per eseguire il debug di qualsiasi valore su stdout.

IO.inspect myoutput 

Utilizzare la comprensione for insieme Erlang di :io.format per formattare in modo esplicito l'uscita, molto simile a printf. Il :a probabilmente genera un errore, ma se si rimuove, il seguente dovrebbe funzionare:

for x <- myoutput do 
    :io.format "~.2f~n", [x] 
end 

notare che ~.2f stampa i valori con due cifre dopo la virgola. ~n aggiunge la nuova riga.

+6

Inoltre, è bello sapere che è possibile inserire un'ispezione all'interno di un'interpolazione di stringhe, ad esempio IO.puts "ecco un elenco: # {inspect mylist}" – GavinBrelstaff

+0

Provato IO.inspect. Viene generato quanto segue: $ elixir putztestzorz.exs putstest [: a, 75,0, 42,857142857142854, 60,0, 42,857142857142854, 2,64e4] Questo dovrebbe essere utilizzato solo per il debug? –

+4

Sì, 'IO.inspect' è progettato per il debug - in generale Elixir non ha modo di indovinare come si desidera rappresentare i dati e' IO.inspect' produrrà solo alcune rappresentazioni di default. Se hai bisogno di un formato di output specifico, dovrai scrivere del codice che lo produce. –