2016-01-27 13 views
7

È possibile avere una funzione per l'impostazione di valori all'interno di una struttura esistente? Im parlando dell'idea di passare la struttura esistente in una funzione e un'impostazione che struttura il valore "nome" (per esempio)?Impostazione del valore della struttura esistente in elisir?

quello che ho: main.exs

Code.require_file("user.exs") # Requiring in module 

person1 = User.constructor("Name") # Making a new user 

IO.write inspect person1 

user.exs

defmodule User do 
    defstruct [name: ""] 

    def constructor(name) do 
     %User{name: name} 
    end 
end 

un modo per ottenere questa idea di lavoro?

def setName(struct, newName) do 
    struct.name = newName 
end 

Grazie

+1

Quando si inizializza la struct, si dovrebbe essere in grado di scrivere semplicemente fuori come avete fatto nel vostro 'user.exs' come' person1 =% User {name: "Nome"} 'invece di chiamare un certo costruttore funzione. –

risposta

8

Assolutamente. Ci sono diversi modi in cui questo può essere realizzato.

defmodule User do 
    defstruct name: nil 

    # Method 1 
    def set_name(user, name) do 
    %{user | name: name} 
    end 

    # Method 2 
    def set_name(user, name) do 
    user |> struct(%{name: name}) 
    end 

    # Method 3 
    def set_name(user, name) do 
    user |> Map.put(:name, name) 
    end 
end 
+2

Si noti che le strutture come tutte le strutture di dati di Elisir sono immutabili, quindi tutte queste creano effettivamente un nuovo Struct con tutti i campi con gli stessi valori di quello vecchio eccetto per il nome che è impostato sul nuovo valore. –

+0

Grazie. Sto venendo da roba OOP quindi è un po 'difficile da usare cose funzionali. Apprezzato. –

+2

Ricorda inoltre che tutti gli approcci presentano differenze sottili, soprattutto quando si impostano le chiavi non valide. Il metodo 1 si alza quando si tenta di impostare una chiave non esistente (dato che una struttura ha tutte le chiavi che fallirà per le chiavi non valide), il metodo 2 scarterà automaticamente tutte le chiavi non valide, il metodo 3 imposterà semplicemente il valore e potenzialmente lascerà un struttura non valida. Quindi, per favore non usare 'Map.put'! Infine, un altro metodo possibile è 'Map.update!', Che è equivalente al metodo 1. –

Problemi correlati