Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir:从Elixir任务访问ETS时参数错误_Elixir_Gen Server_Ets - Fatal编程技术网

Elixir:从Elixir任务访问ETS时参数错误

Elixir:从Elixir任务访问ETS时参数错误,elixir,gen-server,ets,Elixir,Gen Server,Ets,我目前正试图在Elixir中构建一个Redis克隆。作为这项工作的一部分,我使用一个任务来处理get/set请求,并使用ETS来存储键和值 ** (ArgumentError) argument error (stdlib 3.13.2) :ets.insert(:kv, {"doomspork", "Sean", ["Elixir", "Ruby", "Java"]}) 以下是我对相关

我目前正试图在Elixir中构建一个Redis克隆。作为这项工作的一部分,我使用一个任务来处理get/set请求,并使用ETS来存储键和值

** (ArgumentError) argument error
    (stdlib 3.13.2) :ets.insert(:kv, {"doomspork", "Sean", ["Elixir", "Ruby", "Java"]})
以下是我对相关代码部分采取的步骤:

  • 我创建了一个公共ETS表
  • 根据我尝试插入和读取ETS表中的
  • 不幸的是,这给了我这里描述的错误:

  • 您正在尝试在创建ETS之前访问它
    init/1
    回调在进程启动后在进程内调用,但第一次访问尝试发生在
    start
    运行的任务中,这可能发生在更早的时候。在您的例子中,这是一个,它根本没有
    init/1
    回调

    只需将
    :ets.new(:kv,[:set,:public,:named_table])
    移动到
    开始/2
    即可

     def init(_) do
        :ets.new(:kv, [:set, :public, :named_table])
      end
    
     :ets.insert(:kv, {"doomspork", "Sean", ["Elixir", "Ruby", "Java"]})
        IO.inspect(:ets.lookup(:kv, "doomspork"))
    
    [error] Task #PID<0.159.0> started from #PID<0.156.0> terminating
    ** (ArgumentError) argument error
        (stdlib 3.13.2) :ets.insert(:kv, {"doomspork", "Sean", ["Elixir", "Ruby", "Java"]})
        (redis 1.0.0) lib/server.ex:61: Server.write_line/2
        (redis 1.0.0) lib/server.ex:41: Server.serve/1
        (elixir 1.11.0) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
        (stdlib 3.13.2) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
    Function: #Function<0.28410304/0 in Server.loop_acceptor/1>
        Args: []
    
    
    defmodule Server do
      @moduledoc """
      Your implementation of a Redis server
      """
      use Application
      require Logger
    
      def start(_type, _args) do
        Supervisor.start_link(
          [{Task.Supervisor, name: Server.TaskSupervisor}, {Task, fn -> Server.listen() end}],
          strategy: :one_for_one
        )
      end
    
      def init(_) do
        :ets.new(:kv, [:set, :public, :named_table])
      end
    
      @doc """
      Listen for incoming connections
      """
      def listen() do
        {:ok, socket} = :gen_tcp.listen(6379, [:binary, active: false, reuseaddr: true])
        Logger.info("Accepting connections on 6379")
        loop_acceptor(socket)
      end
    
      defp loop_acceptor(socket) do
        {:ok, client} = :gen_tcp.accept(socket)
        {:ok, pid} = Task.Supervisor.start_child(Server.TaskSupervisor, fn -> serve(client) end)
        :ok = :gen_tcp.controlling_process(client, pid)
        loop_acceptor(socket)
      end
    
      defp serve(client) do
        client
        |> read_line()
        |> write_line(client)
    
        serve(client)
      end
    
      defp read_line(socket) do
        {:ok, data} = :gen_tcp.recv(socket, 0)
        data
      end
    
      defp echo(socket, command_arr) do
        echo_statement = Enum.at(command_arr, -2)
        IO.inspect(echo_statement)
        :gen_tcp.send(socket, "+#{echo_statement}\r\n")
      end
      defp write_line(line, socket) do
        command_arr = String.split(line, "\\r\\n")
        command = Enum.at(command_arr, 2) |>String.downcase
        IO.inspect(command_arr)
        IO.inspect(command)
        :ets.insert(:kv, {"doomspork", "Sean", ["Elixir", "Ruby", "Java"]})
        IO.inspect(:ets.lookup(:kv, "doomspork"))
        case command do
          "ping" -> :gen_tcp.send(socket, "+PONG\r\n")
          "set"-> :ets.insert(:kv, {"samplekey", "sampleresp"})
          "get"-> :ets.lookup(:kv, "samplekey")
          "echo"-> echo(socket,command_arr)
          _ -> :gen_tcp.send(socket, "Nah")
        end
      end
    end