syntax - 二郎 : variable 'Result' unsafe in 'try'

标签 syntax compiler-construction scope erlang try-catch

我正在使用 Erlang R16B03。

这段代码:

list_dir(Directory, Retries) when is_integer(Retries), Retries > 0 ->
    Port = get_efile_port(),
    try erlang:port_info(Port) of
        Result ->
            error_logger:info_msg("list_dir - erlang:port_info(~p) ->  ~p ", [Port,Result])
    catch
        _:Reason ->
             error_logger:info_msg("list_dir - erlang:port_info(~p) -> {error, ~p }",[Port,Reason])
    end,
    case prim_file:list_dir(Port, Directory) of
        {error, einval} ->
            error_logger:info_msg(" list_dir -  port : ~p , directory : ~p", [Port, Directory]),
            clear_efile_port(),
            list_dir(Directory, Retries-1);
        Result ->
            Result
    end.

生成以下编译器异常:

/basho/riak/deps/bitcask/src/bitcask_fileops.erl:855: variable 'Result' unsafe in 'try' (line 843)
ERROR: compile failed while processing /basho/riak/deps/bitcask: rebar_abort
make: *** [compile] Error 1

但是如果我将变量名 Result 的第一次使用重命名为 Res,它可以正常编译,例如:

list_dir(Directory, Retries) when is_integer(Retries), Retries > 0 ->
    Port = get_efile_port(),
    try erlang:port_info(Port) of
        Res ->
            error_logger:info_msg("list_dir - erlang:port_info(~p) ->  ~p ", [Port,Res])
    catch
        _:Reason ->
             error_logger:info_msg("list_dir - erlang:port_info(~p) -> {error, ~p }",[Port,Reason])
    end,
    case prim_file:list_dir(Port, Directory) of
        {error, einval} ->
            error_logger:info_msg(" list_dir -  port : ~p , directory : ~p", [Port, Directory]),
            clear_efile_port(),
            list_dir(Directory, Retries-1);
        Result ->
            Result
    end.

据我所知,变量位于两个不同的范围内(try/catch 和 case)。

这是编译器错误还是我未能正确理解 Erlang 语法?

最佳答案

这不是编译器错误。问题是在第一个示例中,您使用 Result在两个地方:首先在 try ,然后再次输入 case 。这不是两个不同的范围,而是相同的范围。编译器会提示,因为如果 try 中没有引发异常, Result将绑定(bind)到 erlang:port_info(Port) 的结果调用,但如果该调用引发异常,Result不会被束缚。这意味着它在 case 范围内使用将是不明确的,因为在第二个 case如果它已经绑定(bind),或者绑定(bind)到 prim_file:list_dir(Port, Directory) 的结果,则它会被匹配。如果尚未绑定(bind)。

关于syntax - 二郎 : variable 'Result' unsafe in 'try' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31563995/

相关文章:

Objective-c 差异

Objective-C block 语法

c - 递归程序中编译器的优化

javascript - 将范围传递给回调函数/绑定(bind)

objective-c - 在@interface 中声明一个ivar 和在@implementation 中放置变量之间的区别

c - printf 中的三元运算符

C++ 返回数组语法

c - 用于 C 语言的基于 Flex/Bison 的词法分析器/解析器

C头文件包含错误

python - 从类定义中的列表理解访问类变量