string - 如何在 Erlang 中为字符串变量重新赋值?
问题描述
我是 Erlang 的新手。我只想为字符串变量重新分配一个值:
get_alert_body(Packet) ->
BodyElement = element(8,Packet),
Body = "my text",
Els = xmpp:get_els(Packet),
lists:foreach(fun(El) ->
ElementName = io_lib:format("~s",[xmpp:get_name(El)]),
IsFile = string:equal(ElementName,"fileType"),
if
IsFile ->
FileType = fxml:get_tag_cdata(El),
IsPhoto = string:equal(FileType,"photo"),
IsVideo = string:equal(FileType,"video"),
if
IsPhoto ->
%% if it gets to this I would like to return "my photo"
Body = "my photo";
IsVideo ->
%% else if it gets to this I would like to return "my video"
Body = "my video";
true ->
%% otherwise I would like to return "my text"
ok
end;
true ->
ok
end
end, Els),
Body.
但我得到这个错误:
error,{badmatch,"test2"}
即使我这样做:
A = "test1",
A = "test2",
我犯了同样的错误。
我会很感激你的帮助。
解决方案
你不能。Erlang 有一个叫做“单一赋值”的特性,这意味着你不能在第一次赋值后改变一个变量的值。如果你尝试这样做,它会变成一个模式匹配,并且你会得到一个badmatch
错误,就像你尝试这样做一样"test1" = "test2"
。
你的例子可以写成:
A =
if
Condition ->
"test2";
true ->
"test1"
end
有关单个作业的更多信息,请参阅此问题及其答案。
在您扩展的示例中,您尝试做的事情可以通过折叠来实现。也就是说,给定一个列表和一个称为“累加器”的附加值,遍历列表并为每个元素调用一个函数,并让该函数的返回值成为新的累加器 - 最后返回累加器。
为此使用lists:foldl/3
,如下所示:
get_alert_body(Packet) ->
BodyElement = element(8,Packet),
DefaultBody = "my text",
Els = xmpp:get_els(Packet),
lists:foldl(fun(El, Body) ->
ElementName = io_lib:format("~s",[xmpp:get_name(El)]),
IsFile = string:equal(ElementName,"fileType"),
if
IsFile ->
FileType = fxml:get_tag_cdata(El),
IsPhoto = string:equal(FileType,"photo"),
IsVideo = string:equal(FileType,"video"),
if
IsPhoto ->
%% if it gets to this I would like to return "my photo"
"my photo";
IsVideo ->
%% else if it gets to this I would like to return "my video"
"my video";
true ->
%% otherwise return the existing value
Body
end;
true ->
ok
end
end, DefaultBody, Els).
推荐阅读
- php - 视口不缩放到中心
- c# - 级联下拉列表 - ASP.NET MVC
- javascript - 在 React 中使用 Shared Worker
- python - 在 Ubuntu 上安装 pgAdmin - 不工作
- php - 无法重新声明 create_post_type()(之前声明过
- python - 在不使用子进程的情况下,有没有办法一次将 matplotlib 中的多个单独的图存储在内存中?
- python - 比较两个数据框,一列,并在匹配时添加某些值?
- avfoundation - 将 NSDate 从 AVDateRangeMetadataGroup 转换为 CMTime
- java - 如何在视图上重复图像
- image-rotation - 如何通过脚本旋转数字显微照片中的 3D 光谱图像?