4

我想在 Erlang 中创建 16 个目录。for ( create_dir("work/p" ++ A, 其中 A 是列表 [0, 1, ... f]) 中的一个元素(十六进制表示法中的十六个数字)。

我当然可以写 16 行,例如:mkdir ("work/p0")、mkdir("work/p1") 等。

我看过列表:foreach。在使用 fun 的示例中,是否可以在循环外定义一个函数并调用它?

我是 Erlang 的新手,习惯于 C++ 等。

4

1 回答 1

5

是的,可以在对lists:foreach/2. 你为什么要呢?这是匿名函数非常方便的情况:

lists:foreach(fun(N) ->
                  file:make_dir(
                      filename:join("work", "p"++integer_to_list(N, 16)))
              end, lists:seq(0, 15)).

filename:join/2调用将使用适当的目录分隔符来构造字符串work/pN,其中N是使用构造的十六进制表示的整数integer_to_list/2,它将整数转换为给定基数 (16) 中的字符串(列表)。

lists:seq/2是一个友好的小函数,它返回[A,A+1,A+2,...,B-1,B]给定的列表AB.

请注意,您也可以在这里使用列表推导语法,但由于我们仅将函数应用于列表以产生副作用,因此我选择坚持使用foreach.

如果你真的想定义一个单独的函数——让我们调用它foo并假设它有 42 个参数——你可以fun foo/42在你的代码中引用它。这个表达式的计算结果是一个函数对象,就像一个内联定义的匿名函数一样,可以传递给lists:foreach/2.

于 2013-03-30T17:16:27.133 回答