続・おまけ
海未「破廉恥です!破廉恥です!!破廉恥です!!!」
凜(予想以上のすごい剣幕にゃ)
海未「何なのですかあれは!?魔力供給と称して、あ、あんなこと・・・」
希(うんうん、顔真っ赤にして取り乱す海未ちゃん、やっぱりええなあ)
海未「それにイリヤスフィール!どうして、どのルートでもあんな目に・・・悲しすぎます-!」
凜(あ、なんだかんだで全ルート最後までやってるにゃ)
海未「星空凛!」
凜「ひゃいっ!?」
海未「分かっていて勧めましたね?そこへ直りなさい!成敗します!」
凜「・・・くっ、殺せ!」
海未「お望み・・・通りに!」
凜「ぎにゃああああああああああああああああああああっ!!」
本編ここから
海未「それでは構造体について説明します」
希(晴れやかな笑顔や)
凜「はいにゃ」
希(死んだ魚の目や)
defmodule Idol do
defmodule Member do
defstruct name: "Umi", age: 16
end
def info do
IO.inspect %Member{} # %Idol.Member{age: 16, name: "Umi"}
IO.inspect %Member{name: "rin", age: 15} # %Idol.Member{age: 15, name: "rin"}
end
end
Idol.info
海未「ここではdefstruct
でMemberという構造体を定義しています。この構造体はnameとageという属性を持っていることが保証されます」
希「defstruct
に書いてる値はデフォルト値?」
海未「そうです。ですから、7行目の書き方だとデフォルト値の入った構造体ができますし、8行目の書き方だとそこで指定した値が入った構造体ができます」
defmodule Idol do
defmodule Member do
defstruct name: "", age: 0
end
def info do
nozomi = %Member{name: "Nozomi Tojo", age: 17}
IO.inspect nozomi.name # "Nozomi Tojo"
IO.inspect %{nozomi | name: "Nozomi Ayase"} # %Idol.Member{age: 17, name: "Nozomi Ayase"}
end
end
Idol.info
海未「これを見ると、なんとなく察しはつくと思いますが・・・」
希「マップやね」
海未「そう、マップです」
is_map %Member{} # true
海未「しかし・・・これだけを見ると完全にマップなのですが、マップの形をしたデータ構造であってマップ型そのものではないので、マップに使える関数が使えるわけではありません」
Dict.size %Member{} # ** (UndefinedFunctionError) undefined function: Idol.Member.size/1
Dict.keys %Member{} # ** (UndefinedFunctionError) undefined function: Idol.Member.keys/1
希「これ、マップじゃ駄目なん?」
海未「マップだと、あるキーが存在するかどうかは実行時にしか分かりませんが、構造体であればdefstruct
で宣言したキーは必ず存在することがコンパイル時に保証される、というのが特徴でしょうか」
希「パターンマッチがやりやすいということ?」
海未「そうですね。同じ構造体のインスタンスは全て同じ形をしていますから」
umi = %Member{name: "Umi Sonoda", age: 16}
%Member{name: name} = umi
IO.puts name # Umi Sonoda
海未「しかし、プロトコルと一緒に使うのが最も効果的な使い方ですね」
希「じゃ、それは次回ウチがやろか」
海未「はい。ではお願いします」
おまけ
希「イリヤの不遇を嘆く海未ちゃんに朗報があるで」
海未「な、なんでしょう・・・」
希「そのイリヤが主人公で大活躍する話があってな。原作はコミックやけどアニメも好評で3期までやっとる」
海未「それはぜひ見てみた・・・いえ、希が勧めるのであれば」
希「地上波で放送しとるやつやし、メジャーなところで配信で見れると思うで」
海未「それなら安心ですね。ありがとうございます」
凜(希ちゃんもなかなかひどいことするにゃ・・・)