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

时间:2019-01-12 15:53:19

标签: elixir

让我们使用这个简单的功能:

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

guides中的示例证明了这种差异。

iex> is_binary(<<100 :: size(9)>>)
false
iex> is_binary(<<100 :: size(8)>>)
true
iex> is_binary(<<100 :: size(7)>>)
false

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

答案 1 :(得分:1)

您应该使用is_binary/1

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

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

iex(1)> is_binary(<<1::1>>)
false
iex(2)> is_bitstring(<<1::1>>)
true

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