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 GenServer';即使vsn在连续的热代码升级中被修复为最后一个版本,仍然再次调用了s code_change?_Elixir - Fatal编程技术网

Elixir GenServer';即使vsn在连续的热代码升级中被修复为最后一个版本,仍然再次调用了s code_change?

Elixir GenServer';即使vsn在连续的热代码升级中被修复为最后一个版本,仍然再次调用了s code_change?,elixir,Elixir,无法成功安装第二个升级版本。从下面的错误日志中,似乎再次调用了代码更改函数,并且错误地处理了状态 复制步骤 我遵循《编程灵丹妙药>=1.6》一书第20章OTP.Applications中的示例和步骤 提交时,我已将应用程序准备为0.2.0版本 提交时,server.ex中的状态已更新,需要运行代码更改。我可以成功地将代码热升级到0.3.0 在以上两个步骤之后,如果我只是更改server.ex中的next\u number函数中的返回文本,并将版本升级到0.3.1,例如,保持步骤2中的code

无法成功安装第二个升级版本。从下面的错误日志中,似乎再次调用了代码更改函数,并且错误地处理了状态

复制步骤

我遵循《编程灵丹妙药>=1.6》一书第20章OTP.Applications中的示例和步骤

  • 提交时,我已将应用程序准备为0.2.0版本
  • 提交时,
    server.ex
    中的状态已更新,需要运行代码更改。我可以成功地将代码热升级到0.3.0
在以上两个步骤之后,如果我只是更改
server.ex
中的
next\u number
函数中的返回文本,并将版本升级到0.3.1,例如,保持步骤2中的code\u change函数不变,则热升级将失败,并出现以下错误

在步骤2之后,我确实运行了新函数
Sequence.Server.next_number()
Sequence.Server.increment_number(2)
多次,以确保它生效,并将状态更新为新格式

问题是,为什么在第二次升级中仍然可以触发版本标记为最新版本的
代码更改(“0”)

错误日志

发布处理程序安装失败:{:代码\u更改\u失败

PID,Sequence.Server,“1”,{:EXIT,{:function_子句,[{Sequence.Server,:code_change,[“1”,%%{struct: Sequence.Server.State,当前_编号:8,增量:2},[],文件: 'lib/sequence/server.ex',行:44]},{:gen_server, :system_code_change,4,[文件:'gen_server.erl',行:794]},{:sys, :do_change_code,5,[文件:'sys.erl',行:573]},{:sys,:do_cmd,6, [文件:'sys.erl',行:465]},{:sys,:handle\u system\u msg,8,[文件: 'sys.erl',行:365]},{:proc_lib,:init_p_do_apply,3,[文件: 'proc_lib.erl',行:249]}}}

问题描述

预期的结果是什么?热代码升级应成功
什么版本的酿酒厂?2.0.9
您在什么操作系统、Erlang/Elixir版本上看到这个问题?Mac 10.13.6,Elixir 1.7.2


这个问题实际上也是作为Github酿酒厂的一个成员提出的。

调用失败,因为它试图调用
代码更改
函数,第一个参数是
“1”
,请阅读错误消息。它从提交的参数开始。当前代码仅允许您(光束等)调用
code\u change/3
函数,第一个参数为“0”。不匹配/不允许任何其他情况

如果要为代码更改功能添加另一个匹配子句,则可以忽略/处理对
“1”
的版本更改:

def code_change("0", old_state = current_number, _extra) do
  new_state = %State{
    current_number: current_number,
    delta: 1
  }
  IO.puts inspect old_state
  IO.puts inspect new_state
  { :ok, new_state }
end
def code_change("1", state, _extra) do
  # your code here for version "1"
  {:ok, state}
end
def code_change(_version, state, _extra) do
  # your code here for any other version
  {:ok, state}
end