我正在尝试在我的eex模板中执行以下操作:
ffmpeg -i test.mkv -c:v copy -bsf h264_mp4toannexb -f h264 test.h264
这将不起作用,因为无法在理解范围内重新分配外部“ current_production_date”变量。这似乎是一种常见的情况,所以我想有一种简单的方法可以完成此操作...我只是想不通...任何提示都值得赞赏!
答案 0 :(得分:1)
虽然@Badu的答案在技术上是正确的,但它的[含义]不是完全惯用的Elixir,因为它具有代码重复并且使用[含义]错误的抽象来表示数据的块。
您所拥有的实际上是一个大块列表,因此您可能需要的是Enum.chunk_while/4
。
chunk_fun = fn
widget, [] ->
{:cont, [widget]}
# ⇓⇓ ⇓⇓ PATTERN MATCH!
%{production_date: pd} = widget, [%{production_date: pd} | _] = prev ->
{:cont, [widget | prev]}
widget, acc ->
{:cont, Enum.reverse(acc), []}
end
after_fun = fn
[] -> {:cont, []}
acc -> {:cont, Enum.reverse(acc), []}
end
widgets = Enum.chunk_while(@widgets, [], chunk_fun, after_fun)
现在在widgets
中,您有@widgets
的块,按日期分组。让我们输出它们:
for [%{production_date: date} | _] = chunk <- widgets do
# output the header with the date
for widget <- chunk do
# render the widget
end
end
我没有测试这段代码,但是它应该可以正常工作。
答案 1 :(得分:0)
您可以使用Enum.reduce/3
来累积结果并在之后输出结果。
<%
current_production_date = nil
{result, _} =
Enum.reduce(@widgets, {[], current_production_date},
fn %{production_date: production_date} = widget, {acc, current_date} ->
if product_date != current_date do
output = "<h1>output a new date header and re-assign current production_date</h1>"
{[output, Phoenix.View.render_to_string(PageView, "widget.html", widget: widget)
|acc], production_date}
else
{[Phoenix.View.render_to_string(PageView, "widget.html", widget: widget) |acc], current_date}
end
end) %>
<%= for w <- Enum.reverse(result) do %>
<%= raw(w) %>
<% end %>
答案 2 :(得分:0)
感谢您的建议,最后我得到了一个来自Elixir论坛的建议...使用__getattr__
:
group_by
我最终将其提取到视图中,因为它直接位于模板中时有点讨厌。