Elixir整数列表到字符串的原因(UnicodeConversionError)无效的代码点

时间:2018-04-23 16:15:41

标签: elixir string-interpolation elixir-framework

问题

我需要创建一个字符串,在其中插入一个整数列表。

"""
SomeQuery {
  someQuery(articleIds: #{inspect article_ids}) {
    edges {
      node {
        id
      }
    }
  }
}
"""

示例失败

例如,列表[725553234]使上面的示例失败:

article_ids = [725553234]

"""
SomeQuery {
  someQuery(articleIds: #{article_ids}) {
    edges {
      node {
        id
      }
    }
  }
}
"""
** (exit) an exception was raised:
    ** (UnicodeConversionError) invalid code point 725553234
        (elixir) lib/list.ex:839: List.to_string/1
        (commsapp_api) lib/my_project/client.ex:70: CommsappApi.News.Clients.CommunicationMs.Client.articles_feed/3

系统

  

Erlang / OTP 20 [erts-9.3] [来源] [64位] [smp:8:8] [ds:8:8:10]   [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

     

Elixir 1.6.3(使用OTP 20编译)

尝试过的解决方案

尝试了以下内容:

  • 使用inspect无效:articleIds: #{inspect(article_ids)}
  • 使用带有:char_lists的{​​{1}}选项的IO.inspect::as_list
  • 尝试将整数列表作为字符串加入:IO.inspect(article_ids, char_lists: :as_lists
  • 将解析为整数的整数插值为:articleIds: [#{Enum.join(article_ids, ", ")}]
  • 我尝试使用单行代替多行字符串,而不是
  • 在尝试不同的解决方案后,我记不起很多事情......>。<

猜测

当使用字符串中的括号时出现问题,Elixir将interporlation视为列表并引发错误,因为它无法找到代码点。

想法?

提前致谢!

2 个答案:

答案 0 :(得分:1)

strings, binaries and charlists的文档中,字符串被定义为点代码列表,即整数。代码

article_ids = [725553234]
"#{article_ids}"

尝试打印点代码为725553234的字符。此点代码未定义,您将收到错误。将725553234替换为65,您应该获得A个字符。

要插入整数列表,您可能需要执行以下操作:

iex(5)> a=[65, 66, 67]
'ABC'
iex(6)> "#{Enum.map(a, fn(c) -> Integer.to_string(c)<>" " end)}"
"65 66 67 "

顺便说一下,如果查看列表[65, 66, 67],则会将其解释为'ABC'

答案 1 :(得分:0)

使用Enum.join返回字符串,并用“,”分隔整数

Enum.join(list, ",")

或通过将每个整数值更改为字符串来使用Enum.map作为列表返回

Enum.map(list, &Integer.to_string/1)

列表= [1、2、3、4]

Enum.join(list, ",") -> "1,2,3,4"

Enum.map(list, &Integer.to_string/1) -> ["1", "2", "3", "4"]