首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在药剂护卫中使用is_bitstring或is_binary作为字符串?

在药剂护卫中使用is_bitstring或is_binary作为字符串?
EN

Stack Overflow用户
提问于 2019-01-12 15:53:18
回答 2查看 7.1K关注 0票数 13

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

代码语言:javascript
复制
  @spec laBionda(String.t()) :: String.t()
  def laBionda(name \\ "you") when is_bitstring(name) do
    "One for #{name}, one for me"
  end

我只想为字符串输入定义函数。

我应该在警卫上使用is_bitstringis_binary吗?有什么不同吗?在这种情况下两者似乎都很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-19 05:42:17

您应该使用is_binary/1

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

is_bitstring/1可以对一些不能用二进制表示的位字符串返回true,例如,单个位:

代码语言:javascript
复制
iex(1)> is_binary(<<1::1>>)
false
iex(2)> is_bitstring(<<1::1>>)
true

你只想要字符串。不属于二进制文件的比特字符串从来不需要,所以越具体的is_binary/1越好选择。

票数 19
EN

Stack Overflow用户

发布于 2019-01-12 16:17:14

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

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

导轨的示例演示了这种差异。

代码语言:javascript
复制
iex> is_binary(<<100 :: size(9)>>)
false
iex> is_binary(<<100 :: size(8)>>)
true
iex> is_binary(<<100 :: size(7)>>)
false

在您的功能中,使用什么护卫并不重要。但是is_binary/1是一种惯例,因为字符串以字节形式存储。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54161232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档