Hatena::Grouperlang

檜山正幸のErlang未確認情報 RSSフィード

 | 

2009-06-10 (水)

便利関数を使ったら不便だった例

| 08:41

「コマンドラインなら1行なのに、、、」に書いたコレ:

% @doc ファイルの種類を返す.
% @spec (string()) -> (not_exist | dir | regular | special)
file_type(Filename) ->
  case filelib:is_file(Filename) of
    false ->
      not_exist;
    true ->
      case filelib:is_dir(Filename) of
        true ->
          dir;
        false ->
          % regularとspecialの区別はあんまり当てにならないみたい
          case filelib:is_regular(Filename) of
            true ->
              regular; 
            false ->
              special
          end
      end
  end.

filelibを使ったためにかえって鬱陶しくなった。read_file_info/1 を直接使ったほうが単純。

-include_lib("kernel/include/file.hrl").

%% 戻り値は file.hrl を参照
file_type(Filename) ->
  case file:read_file_info(Filename) of
    {ok, Info} ->
      Info#file_info.type;
    {error, enoent} ->
      not_exist;
    {error, Reason} ->
      throw(Reason)
  end.

↑これは、裸の値(アトムだけ)かthrow例外で応答する。ok/error方式なら、

file_type_2(Filename) ->
  case file:read_file_info(Filename) of
    {ok, Info} ->
      {ok, Info#file_info.type};
    {error, Reason} ->
      {error, Reason}
  end.

common_errorを使うなら、

 throw({{?MODULE, io_error}, Reason})

とか。

しばらく書いてないと忘れてしまうこと

| 16:58

caseやifの入れ子を使うより、

  1. 引数パターンを使って関数節に分ける
  2. ガードを使って条件を記述する(これも関数節)
  3. あまり複雑にならないなら論理演算子 andalso, orelse を使う

としたほうがたいてい見やすい。

lpgtksgbfplpgtksgbfp2014/01/14 17:18hrffsfsmboh, <a href="http://www.twrxyjffyc.com/">vocqtmovko</a> , [url=http://www.adoypvwbqp.com/]rabrbhjvxx[/url], http://www.mtapblapqb.com/ vocqtmovko

 |