在Elixir Guard中为字符串使用is_bitstring或is_binary吗?

Mar*_*abe 2 elixir

让我们来看看这个简单的函数:

  @spec laBionda(String.t()) :: String.t()
  def laBionda(name \\ "you") when is_bitstring(name) do
    "One for #{name}, one for me"
  end
Run Code Online (Sandbox Code Playgroud)

我只想为String输入定义函数。

我应该使用警卫队is_bitstring还是is_binary警卫队?有什么区别吗?在这种情况下,两者似乎都很好。

Vol*_*pan 5

根据这个答案:https : //stackoverflow.com/a/10821192/10895259

二进制和位串之间的区别是二进制的长度可以被8整除,即它不包含“部分”字节。位串没有这种限制。

指南中的示例演示了这种差异。

iex> is_binary(<<100 :: size(9)>>)
false
iex> is_binary(<<100 :: size(8)>>)
true
iex> is_binary(<<100 :: size(7)>>)
false
Run Code Online (Sandbox Code Playgroud)

在您的功能中,使用哪种防护并不重要。但这is_binary/1是一个约定,因为字符串以字节存储。

  • 无关紧要的是,“ is_bitstring / 1”将传递无效的“ Elixir字符串”,例如““ foo#{&lt;&lt; 100 :: size(7)&gt;&gt;} bar”`将作为“ String”失败.Chars没有为位字符串实现。 (2认同)

Ada*_*hip 5

您应该使用is_binary/1

Elixir中的字符串表示为二进制文件。Elixir二进制文件是字节序列,而位串是位序列。虽然所有二进制文件都是位字符串,但并非所有位字符串都是二进制文件。

is_bitstring/1可以返回true一些无法用二进制表示的位串,例如单个位:

iex(1)> is_binary(<<1::1>>)
false
iex(2)> is_bitstring(<<1::1>>)
true
Run Code Online (Sandbox Code Playgroud)

您只希望使用字符串。不是二进制文件的位串是永远不需要的,因此越具体is_binary/1越好。