协议可枚举未实现 - Elixir

Posted

技术标签:

【中文标题】协议可枚举未实现 - Elixir【英文标题】:Protocol Enumerable not implemented for - Elixir 【发布时间】:2016-05-09 00:52:06 【问题描述】:

我正在关注这个教程building-a-simple-stream-media-app

当我将列表更改为 Struct 不太确定我在做什么,对此真的很陌生。它不起作用,继续获取

协议可枚举未实现

我的控制器

defmodule Blog.PageController do
      use Blog.Web, :controller

      def index(conn, _params) do
        media_dir = "./priv/static/media/"
        filetype = [".mp4", ".png"]
        :ok, files = File.ls(media_dir)
        filtered_files = Enum.filter(files, fn(file) -> String.ends_with?(file, [".mp4", ".png"]) end)
        struct_files = Enum.map(filtered_files, fn(file) -> %Blog.Mediafilename: file end )
        render conn, "index.html", files: struct_files
      end

      def show(conn, %"filename" => filename) do
        render conn, "show.html", filename: filename
      end
    end

型号

defmodule Blog.Media do
  @derive Phoenix.Param, key: :filename
  defstruct [:filename]
end

【问题讨论】:

请提供完整的错误信息 行号特别有用。 protocol Enumerable not implemented for %Blog.Mediafilename: "findingnemo.mp4" 这是错误消息。 【参考方案1】:

您不能在他提到 Elixir 1.1 的教程中派生 Enumerable 但教程 github 使用 1.0 - 另请参阅此问题。 https://github.com/elixir-lang/elixir/issues/3821。只需返回一个映射而不是一个结构。

def index(conn, _params) do
    render conn, "index.html", files: media_files
end

defp media_files do
    media_dir = "</your/file_path/>"
    :ok, files = File.ls(media_dir)
    filetype = [".mp4", ".mp3"]

    Enum.filter(files, fn(file) -> 
      String.ends_with?(file, filetype)
    end)
    |> Enum.map(fn(file) -> 
      %filename: file # Map
    end)
end

【讨论】:

非常感谢!我知道这与那个错误有关,但是作为 Elixir 的新手,我不知道如何解决它。我也知道教程中有无数错误,因为它在多个场合都没有工作。

以上是关于协议可枚举未实现 - Elixir的主要内容,如果未能解决你的问题,请参考以下文章

Elixir:如何使结构可枚举

未为 MyApp.MyStruct 实现协议可枚举

为啥元组在 Elixir 中不可枚举?

Phoenix/Elixir - 协议 Enumerable 未实现

Elixir Enum vs Erlang列表

如何在 Elixir 中生成随机数?