在 Elixir 中,我們可以IO.inspect anyStructure將anyStructure' 的內部結構列印到輸出。是否有類似的方法將其輸出到檔案(或者,作為更靈活的解決方案,輸出到字串)?
我瀏覽了一些關于除錯和io的文章,但沒有找到解決方案。我也試過
{:ok, file} = File.open("test.log", [:append, {:delayed_write, 100, 20}])
structure = %{ a: 1, b: 2 }
IO.binwrite(file, structure)
File.close file
但這會導致
no function clause matching in IO.binwrite/2 [...]
def binwrite(device, iodata) when is_list(iodata) or is_binary(iodata)
我還搜索了一些“elixir serialize”和“elixir object to string”,但沒有發現任何有用的東西(比如:erlang.term_to_binary回傳二進制檔案)。有沒有一種簡單的方法可以將列印的結果IO.inspect列印到檔案或字串中?
uj5u.com熱心網友回復:
已經有inspect/2功能了,隨它去吧:
#> inspect({1,2,3})
"{1, 2, 3}"
#> h inspect/2
def inspect(term, opts \\ [])
@spec inspect(
Inspect.t(),
keyword()
) :: String.t()
Inspects the given argument according to the Inspect protocol. The second
argument is a keyword list with options to control inspection.
之后你可以對字串做任何你想做的事情。
uj5u.com熱心網友回復:
您可以提供IO.inspect一個額外的引數來告訴它在哪里寫信:
{:ok, pid} = StringIO.open("")
IO.inspect(pid, %{test: "data"}, label: "IO.inspect options work too \o/")
{:ok, {_in, out}} = StringIO.close(pid)
out # "IO.inspect options work too o/: %{test: \"data\"}\n"
它接受一個pid要寫入的行程。StringIO提供了這樣一個程序,關閉時回傳一個字串。
uj5u.com熱心網友回復:
您只需要組合inspect/2回傳二進制檔案和 File.write/3/或任何其他轉儲到檔案的函式。
File.write("test.log", inspect(%{a: 1, b: 2}, limit: :infinity))
請注意該limit: :infinity選項,如果沒有它,長結構將被截斷,以便在檢查 to 時獲得更好的可讀性stdout。
uj5u.com熱心網友回復:
在 Elixir 中,我們可以 IO.inspect anyStructure 以將 anyStructure 的內部結構列印到輸出。
這并不完全正確。IO.inspect使用檢查協議。您看到的不是結構的內部結構,而是該結構對 Inspect 協議的實作被撰寫以產生的任何內容。您可以提供不同的選項來進行檢查,定義在 中Inspect.Opts,其中之一是structs: false,它將結構列印為映射。
例如,檢查范圍結構:
iex> inspect(1..10)
"1..10"
iex> inspect(1..10, structs: false)
"%{__struct__: Range, first: 1, last: 10, step: 1}"
要回答您的問題并添加其他答案,這是一種用于File.open!/3重用打開的檔案并將多個檢查呼叫記錄到同一檔案,然后關閉檔案的方法:
File.open!("test.log", [:write], fn file ->
IO.inspect(file, %{ a: 1, b: 2 }, [])
IO.inspect(file, "logging a string", [])
IO.inspect(file, DateTime.utc_now!(), [])
IO.inspect(file, DateTime.utc_now!(), structs: false)
end)
這會產生以下test.log檔案:
%{a: 1, b: 2}
"logging a string"
~U[2022-04-29 09:51:46.467338Z]
%{
__struct__: DateTime,
calendar: Calendar.ISO,
day: 29,
hour: 9,
microsecond: {485474, 6},
minute: 51,
month: 4,
second: 46,
std_offset: 0,
time_zone: "Etc/UTC",
utc_offset: 0,
year: 2022,
zone_abbr: "UTC"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/467552.html
