如何在 Erlang 中使用变量作为引用传递?

Posted

技术标签:

【中文标题】如何在 Erlang 中使用变量作为引用传递?【英文标题】:How to use a variable as pass by reference in Erlang? 【发布时间】:2021-02-20 01:19:05 【问题描述】:

为什么我的输出没有反映在 Lst1 中?

-module(pmap). 
-export([start/0,test/2]). 

test(Lst1,0) ->
   ok, [Temp] = io:fread( "Input the edge weight  ", "~d" ),
   lists:append([Lst1,[Temp]]),
   io:fwrite("~w~n",[Lst1]);

test(Lst1,V) ->
   ok, [Temp] = io:fread( "Input the edge weight  ", "~d" ),
   lists:append([Lst1,[Temp]]),
   test(Lst1, V-1).

start() -> 
   ok, [V] = io:fread( "Input the number of vertices your graph has  ", "~d" ),
   Lst1 = [],
   test(Lst1,V).

所以,我的 Lst1 正在打印 [],而我希望它打印,假设,如果我提供输入 1,2,3,则 [1,2,3]。

【问题讨论】:

【参考方案1】:

因为 Erlang 变量是不可变的,根本无法更改。 lists:append 返回一个你扔掉的新列表。

【讨论】:

感谢您的评论,实现此目的的替代选择是什么?我对 Erlang 很陌生。 您的 test 函数应该返回新列表。 Brujo Benavides 的回答显示了一些方法。【参考方案2】:

正如@Alexey Romanov 正确指出的那样,您没有使用lists:append/2 的结果。

这就是我将如何修复您的代码...

-module(pmap). 
-export([start/0,test/2]). 

test(Lst1,0) ->
    ok, [Temp] = io:fread( "Input the edge weight  ", "~d" ),
    Lst2 = lists:append([Lst1,[Temp]]),
    io:fwrite("~w~n",[Lst2]),
    Lst2;
test(Lst1,V) ->
    ok, [Temp] = io:fread( "Input the edge weight  ", "~d" ),
    Lst2 = lists:append([Lst1,[Temp]]),
    test(Lst2, V-1).

start() -> 
   ok, [V] = io:fread( "Input the number of vertices your graph has  ", "~d" ),
   Lst1 = [],
   test(Lst1,V).

但实际上,实现相同结果的更惯用代码将是……

-module(pmap). 
-export([start/0,test/2]). 

test(Lst1,0) ->
    ok, [Temp] = io:fread( "Input the edge weight  ", "~d" ),
    Lst2 = lists:reverse([Temp|Lst1]),
    io:fwrite("~w~n",[Lst2]),
    Lst2;
test(Lst1,V) ->
    ok, [Temp] = io:fread( "Input the edge weight  ", "~d" ),
    test([Temp | Lst1], V-1).

start() -> 
   ok, [V] = io:fread( "Input the number of vertices your graph has  ", "~d" ),
   Lst1 = [],
   test(Lst1,V).

【讨论】:

以上是关于如何在 Erlang 中使用变量作为引用传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据源从一个模块引用到另一个模块并将其作为变量传递给根模块?

值传递和引用传递

临时变量作为非const的引用进行参数传递引发的编译错误

c# 值传递 引用传递

你可以在 Terraform 中将块作为变量传递,引用资源嵌套块内容的类型吗?

将 ngModel 模板引用变量作为 AbstractControl 传递给输入变量