IO.puts/2
我們先前有稍微使用 IO.puts/2
來印出結果
我們在 iex 中使用試試看
iex(4)> IO.puts(3)
3
:ok
印出 3 之後,IO.puts(3)
的回傳值為 :ok
不過 puts 只能印出能轉成文字的內容,在其他像是 map 測會報錯
iex(5)> IO.puts(%{name: "Tim"})
** (Protocol.UndefinedError) protocol String.Chars not implemented for type Map
Got value:
%{name: "Tim"}
(elixir 1.18.4) lib/string/chars.ex:3: String.Chars.impl_for!/1
(elixir 1.18.4) lib/string/chars.ex:22: String.Chars.to_string/1
(elixir 1.18.4) lib/io.ex:807: IO.puts/2
iex:5: (file)
如果需要 debug 觀察欄位的值的話會使用接下來的 IO.inspect/2
IO.inspect/2
iex(3)> IO.inspect(3)
3
3
使用後乍看之下跟 puts 差不多,但是他顯示的是值在 Elixir 語法,而不是像 IO.puts/2
是給類似 CLI 介面互動使用的印出,這個可供 debug 使用
iex(5)> IO.inspect(%{name: "Tim"})
%{name: "Tim"}
%{name: "Tim"}
另外這個函式回傳的值為傳入的值,所以當我們要 debug 連續 pipe 的程式碼時,可以安心的在要查看的地方直接加入 |> IO.inspect()
而不影響後續的 pipe
原本的程式碼
["Elixir", "Erlang", "Gleam"]
|> Enum.sort()
|> Enum.map(&String.length/1)
|> Enum.sum()
如果我們要看在 sum 之前的值
["Elixir", "Erlang", "Gleam"]
|> Enum.sort()
|> Enum.map(&String.length/1)
|> IO.inspect()
|> Enum.sum()
IO.gets/2
在 CLI 介面提供文字輸入
IO.gets("輸入你的名字: ")