gpt4 book ai didi

decimal - 依赖项目中的重复协议(protocol)实现

转载 作者:行者123 更新时间:2023-12-03 14:44:49 25 4
gpt4 key购买 nike

我在 Elixir 项目中合并协议(protocol)实现时遇到问题。更具体地说,我使用 Ecto和一些名为 Gold 的简单项目(atm 无关紧要)。问题是,他们( EctoGold )都使用 Poison序列化 Decimals (并实现适当的协议(protocol))。
Ecto 的实现看起来有点像这样:

defimpl Poison.Encoder, for: Decimal do
def encode(decimal, _opts), do: <<?", Decimal.to_string(decimal)::binary, ?">>
end

在开发过程中,有一条警告说模块重复:
warning: redefining module Poison.Encoder.Decimal (current version loaded from /(...)/_build/dev/lib/gold/ebin/Elixir.Poison.Encoder.Decimal.beam)
lib/ecto/poison.ex:2

但是当我尝试使用例如 exrm构建一个版本,然后我得到错误说我有 duplicate_modules
===> Provider (release) failed with: {error,
{rlx_prv_assembler,
{release_script_generation_error,
systools_make,
{duplicate_modules,
[{{'Elixir.Poison.Encoder.Decimal',
gold,
"/(...)/rel/bitcoin_api/lib/gold-0.12.0/ebin"},
{'Elixir.Poison.Encoder.Decimal',
ecto,
"/(...)/rel/bitcoin_api/lib/ecto-2.0.2/ebin"}}]}}}}

我应该如何处理?这里的情况是我实际上使用了我自己的 Gold 版本。 ,所以我可以篡改它以尽快修复它。我知道我可以添加 EctoGold作为依赖项,但是仅仅实现一个这样的协议(protocol)似乎有点过头了。是不是有某种宏来检查模块是否已经实现?

最佳答案

一个快速的解决方法是将 Gold 的实现封装在 Code.ensure_loaded?/1 中。

unless Code.ensure_loaded?(Ecto) do
defimpl Poison.Encoder, for: Decimal do
def encode(decimal, _opts), do: <<?", Decimal.to_string(decimal)::binary, ?">>
end
end
它有点恶心,但您不必添加 Ecto,只需检查是否有其他东西已经将其拉入

关于decimal - 依赖项目中的重复协议(protocol)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com