Track
/
Elixir
Elixir
/
Esercizi
/
Newsletter
Newsletter

Newsletter

Esercizio di apprendimento

Introduzione

File

Il modulo File fornisce le funzioni per lavorare con i file.

Per leggere un intero file, usa File.read/1. Per scrivere su un file, usa File.write/2.

Ogni volta che si scrive su un file con File.write/2, viene aperto un descrittore di file. Viene anche avviato un nuovo processo Elixir. Per questo motivo, è meglio evitare di scrivere su un file in un ciclo usando File.write/2.

Invece, si può aprire un file usando File.open/2. Il secondo argomento di File.open/2 è una lista di modalità, che permette di specificare se si vuole aprire il file in lettura o in scrittura.

File.open/2 restituisce un PID di un processo che gestisce il file. Per leggere e scrivere sul file, usa le funzioni del modulo IO e passa questo PID come dispositivo IO.

Quando hai finito di lavorare con il file, chiudilo con File.close/1.

Tutte le funzioni menzionate del modulo File hanno anche una variante ! che solleva un errore invece di restituire una tupla di errore (ad esempio File.read!/1). Usa quella variante se non hai intenzione di gestire errori come file mancanti o mancanza di permessi.

Istruzioni

Sei un grande appassionato di modellismo ferroviario e hai deciso di condividere la tua passione con il mondo lanciando una newsletter. Per iniziare, invierai il primo numero della tua newsletter agli amici e ai conoscenti che condividono il tuo hobby. Hai un file di testo con un elenco dei loro indirizzi email.

1. Leggere gli indirizzi email da un file

Implementa la funzione Newsletter.read_emails/1. Deve accettare un percorso di file. Il file è un file di testo che contiene indirizzi email separati da caratteri di nuova riga. La funzione deve restituire un array con gli indirizzi email contenuti nel file.

Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]

2. Aprire un file di log in scrittura

Inviare un'email è un'operazione che può fallire per molti motivi imprevedibili, come un refuso nell'indirizzo email o problemi temporanei di rete. Per poter ritentare l'invio delle email a tutti i tuoi amici senza inviarne di duplicate, devi registrare gli indirizzi email che hanno già ricevuto l'email. Per farlo, ti serve un file di log.

Implementa la funzione Newsletter.open_log/1. Deve accettare un percorso di file, aprire il file in scrittura e restituire il PID del processo che gestisce il file.

Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>

3. Registrare un'email inviata

Implementa la funzione Newsletter.log_sent_email/2. Deve accettare il PID del processo che gestisce il file e una stringa con l'indirizzo email. Deve scrivere l'indirizzo email nel file, seguito da un carattere di nuova riga.

Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok

4. Chiudere il file di log

Implementa la funzione Newsletter.close_log/1. Deve accettare il PID del processo che gestisce il file e chiudere il file.

Newsletter.close_log(pid)
# => :ok

5. Inviare la newsletter

Ora che hai tutti i pezzi che compongono la procedura di invio delle email, devi combinarli in un'unica funzione.

Implementa la funzione Newsletter.send_newsletter/3. Deve accettare il percorso del file con gli indirizzi email, il percorso di un file di log e una funzione anonima che invia un'email a un dato indirizzo email. Deve leggere tutti gli indirizzi email dal file indicato e provare a inviare un'email a ognuno di essi. Se la funzione anonima che invia l'email restituisce :ok, scrivi l'indirizzo email nel file di log, seguito da un carattere di nuova riga. Assicurati di farlo non appena l'email è stata inviata. Dopo aver terminato tutti gli invii, chiudi il file di log.

Newsletter.send_newsletter(
  "model_train_friends_emails.txt",
  "newsletter_issue1_log.txt",
  fn email -> :ok end
)

# => :ok
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Elixir Exercism

Vuoi iniziare Newsletter?

Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.