[英]Can not compile Erlang file using file module
當我想編譯一個簡單的file.erl
文件時,出現錯誤消息。
$ erlc file.erl
/opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34: type date_time() undefined
以下是file.erl的內容
-module(file).
-include_lib("kernel/include/file.hrl").
-export([file_info/1]).
file_info(Dir) ->
{ok, F} = file:read_file_info(Dir),
io:format("~p~n", [F#file_info.type]).
似乎沒有人報告過此類問題,我的操作有什么問題嗎?
調查編譯問題的根本原因很有幫助。 編譯器發出此錯誤:
/opt/erlang17.5/lib/kernel-3.2/include/file.hrl:34:鍵入date_time()未定義
查看file.hrl
第34行,我們看到:
ctime :: file:date_time() | non_neg_integer(),
這是#file_info{}
記錄的ctime
字段的類型說明符。 它指出ctime
可以保存file:date_time()
類型或non_neg_integer()
類型的值。
該錯誤消息專門抱怨date_time()
類型,因為它的范圍表明它是在file
模塊中定義的。 在這種情況下, file
模塊就是正在定義和編譯的模塊,它隱藏了Erlang / OTP kernel
應用程序提供的標准kernel
。 標准file
模塊如下定義其date_time()
類型:
-type date_time() :: calendar:datetime().
但是,我們嘗試編譯的file
模塊沒有。 如果添加此類型定義會怎樣?
-module(file).
-type date_time() :: calendar:datetime().
-include_lib("kernel/include/file.hrl").
-export([file_info/1]).
file_info(Dir) ->
{ok, F} = file:read_file_info(Dir),
io:format("~p~n", [F#file_info.type]).
現在可以編譯包含添加的類型定義的此版本:
$ erlc file.erl
$
我們已經修復了編譯錯誤,所以讓我們嘗試使用編譯后的模塊。 我們啟動一個Erlang shell:
$ erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]
{"init terminating in do_boot",{undef,[{file,path_eval,[[".","/Users/user"],".erlang"],[]},{c,f_p_e,2,[{file,"c.erl"},{line,481}]},{init,eval_script,8,[]},{init,do_boot,3,[]}]}}
Crash dump is being written to: erl_crash.dump...done
init terminating in do_boot ()
在錯誤消息中,我們可以看到嘗試調用file:path_eval/2
失敗,因為未定義。 因為我們的file
模塊隱藏了標准模塊,但沒有提供所有相同的功能,所以只要我們的file
模塊隱藏標准模塊,我們甚至無法啟動Erlang Shell。
顯然,不僅要解決原始的編譯錯誤,還需要為模塊選擇一個不同的名稱。
您的代碼正確,問題出在文件名上。 Erlang具有庫“文件”,因此您不能使用此文件名。 更改它(別忘了修改源代碼),一切都會好起來的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.