Part18:構造体

続・おまけ

海未「破廉恥です!破廉恥です!!破廉恥です!!!」
凜(予想以上のすごい剣幕にゃ)
海未「何なのですかあれは!?魔力供給と称して、あ、あんなこと・・・」
希(うんうん、顔真っ赤にして取り乱す海未ちゃん、やっぱりええなあ)
海未「それにイリヤスフィール!どうして、どのルートでもあんな目に・・・悲しすぎます-!」
凜(あ、なんだかんだで全ルート最後までやってるにゃ)
海未「星空凛!」
凜「ひゃいっ!?」
海未「分かっていて勧めましたね?そこへ直りなさい!成敗します!」
凜「・・・くっ、殺せ!」
海未「お望み・・・通りに!」
凜「ぎにゃああああああああああああああああああああっ!!」


本編ここから

海未「それでは構造体について説明します」
希(晴れやかな笑顔や)
凜「はいにゃ」
希(死んだ魚の目や)

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期までやっとる」
海未「それはぜひ見てみた・・・いえ、希が勧めるのであれば」
希「地上波で放送しとるやつやし、メジャーなところで配信で見れると思うで」
海未「それなら安心ですね。ありがとうございます」
凜(希ちゃんもなかなかひどいことするにゃ・・・)


LINEで送る
Pocket