TIL:Elixir字符串和Erlang二进制文件

Elixir中的字符串在内部由二进制表示。 我们不使用is_string / 1 ,而是使用is_binary / 1进行检查。 在Erlang中,值得注意的是,使用双引号将字符串括起来实际上是一个字符列表。 让我们看看并在iex上尝试一下:

 iex(1)> is_binary("hello world") 
iex(2)> is_list(“ hello world”)
iex(3)> is_list('hello world')#注意单引号
iex(4)> <> ===“一些字符”

现在,让我们在erl上尝试一下:

  1> is_list('some chars')。 
2> is_list(“一些字符”)。
3> is_binary(“一些字符”)。
4> is_binary('some chars')。
5> is_binary(<>)。

我们使用连接字符串,其称为二进制连接运算符:

  iex>“您好” “世界”  <> 
iex> byte_size(“ Hello world!”)

当串联为空字节时,二进制串联运算符将公开字符串的二进制表示形式。

  iex>“显示我”  <> 

我们还可以使用IO.puts / 1打印代码点的字符表示。

  iex> IO.puts < 
:好

模式匹配和解构字符串也是可行的:

  iex)> <> =“ Hello world!” 
iex)>休息

关于Erlang互操作性的补充说明

我们在Elixir中通常不使用字符列表。 但是,当与某些Erlang库进行对话时,许多较旧的库可能不支持二进制文件,因此我们需要将Elixir字符串转换为char列表。 让我们在Erlang的HTTP客户端(httpc)上尝试一下。 请注意,在Elixir中,Erlang模块以原子表示:

  iex(1)>:inets.start() 
iex(2)>:httpc.request(:get,{'http://www.erlang.org',[]},[],[])
iex(3)>:httpc.request(:get,{“ http://www.erlang.org”,[]},[],[])
(stdlib)string.erl:213::string.substr2(“ http://www.erlang.org”,1)
(inets)http_uri.erl:201::http_uri.split_uri / 5
(inets)http_uri.erl:89::http_uri.parse / 2

(因此,下次遇到Elixir中缺少的函数或库时,请尝试并参考Erlang的标准库。)