2016-01-27 11 views
7

既存の構造体内に値を設定する機能はありますか? Imは、既存の構造体を関数に渡し、その構造体の "name"値(たとえば)を設定するという考えについて話していますか?Elixirに既存の構造体の値を設定していますか?

私が持っているもの: 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 

作業このアイデアを取得する方法?

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

おかげで絶対に

+1

関数。 –

答えて

8

。これを達成するにはいくつかの方法があります。代わりに、いくつかのコンストラクタを呼び出すの `:あなたは、構造体を初期化するとき、あなたは` PERSON1 =%ユーザ{「名前」名}のようなあなたの `user.exs`に行ったようにそれを書き出すことができるはず

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

すべてのElixirデータ構造体としてのstructsは不変であるので、これらはすべて、新しい値に設定されたnameを除いて、古いものと同じ値を持つすべてのフィールドを持つ新しいStructを実際に作成します。 –

+0

ありがとうございます。私はOOPのものから来ているので、その機能的なものを使うのは少し難しいです。感謝。 –

+2

また、すべてのアプローチには、特に無効なキーを設定するときに微妙な違いがあることにも注意してください。メソッド1は、存在しないキーを設定しようとすると発生します(構造体には無効なキーで失敗するすべてのキーがあるため)。メソッド2は無効なキーをすべて破棄します。メソッド3は値を設定します。無効な構造体。だから、 'Map.put'を使わないでください!最後にもう1つの方法は 'Map.update!'です。これは方法1に相当します。 –