如何解决如何使用“ |”要将多个列表附加到现有列表中?
我有这个:
<%= for x <- [
"a1.css","a2.css",| List.wrap(assigns[:my_css])
] do %>
我如何在其中添加一个CSS文件列表,而不必使用++
但这不会编译:
<%= for x <- [
"a1.css",| List.wrap(assigns[:my_css])
| ["my_custom1.css","my_custom2.css"] # won't compile
] do %>
如何解决?
订单应保持不变。
解决方法
简短的回答:您不能,而必须使用++
,所以:
l1 = [1,2,3]
l2 = [4,5,6]
[7,8 | l1] ++ l2 # => [7,8,1,3,4,6]
更长的答案-使用[|]
时,您会将项目放在列表的前面。通过创建一个新列表(其中旧列表为尾)(这是O(1)
操作),可以在不更改原始列表的情况下完成此操作。但是,当您要连接两个列表时,就无法以这种简单的方式实现-为了保留两个原始列表(您必须这样做,因为Elixir数据是不可变的),Elixir必须通过在每个列表之前添加每个项目来创建一个新列表一个列表到另一个列表,所以这是一个O(n)
操作。因此,(我怀疑)为此目的有一个不同的运算符。
|
运算符始终生成[single_item | existing_list]
。
您始终可以建立多个列表:["a1" | ["a2" | another_list]]
并获得所需的结果单个列表-但您只能尝试找出哪些项目是列表。
在您的代码示例中,您似乎正在尝试解决两个问题:建立CSS文件名列表,然后在for
循环中对每个文件名进行处理。
在Elixir中,通常使用Enum.map()
或Enum.reduce()
来执行相同的操作,而没有for循环。 (很难说,不知道您的最终目标。)
至少,您可以简单地执行以下两个步骤:
- 建立您关心的项目列表
- 然后使用
for
或Enum.map()
遍历它们
# if everything was wrapped as a List already
css_files = Enum.concat([["a1.css"],List.wrap(assigns[:my_css]),["b2.css","b3.css"]])
# or,if it's not
css_files = List.flatten(["a1.css",["c2.css","c3.css"]])
# separately
for x <- css_files do
# ...
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。