はじめに
- 2020/09/02に行われたfukuoka.ex#41:Elixirお茶会にてこんな質問がありました
Player |> Repo.all |> Enum.map(& &1.number)
みたいなコードの結果が'\t\b'になりました。これは何でしょうか?
答えはCharlistsでしょう
iex> [9, 8]
'\t\b'
-
ElixirはListの要素がすべて整数で、それぞれの整数がアスキー文字として印字可能なものであれば、シングルクォーテーション(
'
)でくくられたアスキー文字の列で表示することになっています - いやいやそんなのやめてくれ、整数のリストで表示したいよという場合にはIExの設定を変えてあげるとよいです
- 整数のリストで結果を確認したいときはIExの設定を変えてあげましょう
-
~/.iex.exs
に設定を予め書いておくこともできます
-
iex> IEx.configure(inspect: [charlists: :as_lists])
:ok
iex> [9, 8]
[9, 8]
-
h IEx.configure
とh Inspect.Opts
でヘルプを表示すると設定の仕方が書いてあります
本当にそうなの?
- 簡単なPhoenixプロジェクトを作って試してみます
- 準備はこのあたりをご参照ください
$ mix phx.new hello --live
$ cd hello
$ mix ecto.create
$ mix phx.gen.live Baseball Player players name:string number:integer
-
router.ex
の変更は、今回の例では必ずしも必要な手順ではありません
lib/hello_web/router.ex
scope "/", HelloWeb do
pipe_through :browser
live "/", PageLive, :index
live "/players", PlayerLive.Index, :index # add
live "/players/new", PlayerLive.Index, :new # add
live "/players/:id/edit", PlayerLive.Index, :edit # add
live "/players/:id", PlayerLive.Show, :show # add
live "/players/:id/show/edit", PlayerLive.Show, :edit # add
end
priv/repo/seeds.exs
Hello.Repo.insert!(%Hello.Baseball.Player{name: "テッド・ウィリアムズ", number: 9})
Hello.Repo.insert!(%Hello.Baseball.Player{name: "原辰徳", number: 8})
$ mix ecto.migrate
$ mix run priv/repo/seeds.exs
$ iex -S mix
iex> alias Hello.Repo
Hello.Repo
iex> alias Hello.Baseball.Player
Hello.Baseball.Player
iex> Player |> Repo.all |> Enum.map(& &1.number)
[debug] QUERY OK source="players" db=8.4ms decode=1.6ms queue=0.8ms idle=1527.6ms
SELECT p0."id", p0."name", p0."number", p0."inserted_at", p0."updated_at" FROM "players" AS p0 []
'\t\b'
- うん、やっぱりそうだね
iex> IEx.configure(inspect: [charlists: :as_lists])
:ok
iex> Player |> Repo.all |> Enum.map(& &1.number)
[debug] QUERY OK source="players" db=2.6ms idle=1775.7ms
SELECT p0."id", p0."name", p0."number", p0."inserted_at", p0."updated_at" FROM "players" AS p0 []
[9, 8]