Elixir两种二进制模式匹配为何输出98与"b"不同?
关于Elixir二进制匹配输出差异的解答
嘿,这个细节确实容易让刚接触Elixir的朋友困惑,我来给你理清楚这两种写法的核心区别~
首先,虽然这两种模式匹配都能正确把"banana"拆成第一个元素和剩余部分,但它们对head变量的类型解析规则完全不同:
对于
<<head, rest::binary>>的写法:
当你在二进制匹配里不给变量指定类型约束时,Elixir默认会把单个字节解析成对应的ASCII整数。"b"对应的ASCII码值就是98,所以这里的head会被绑定为整数98。对于
<<head::binary-size(1), rest::binary>>的写法:
这里你明确给head指定了类型约束binary-size(1),意思是要匹配长度为1的二进制串。而Elixir里的字符串本身就是UTF-8编码的二进制,所以这个约束会直接把第一个字节解析成对应的字符"b",head也就被绑定为字符串类型的"b"。
你提到的“内部等价”其实是指两种匹配的拆分逻辑一致,都能正确分离出第一个字符的字节和剩余内容,但变量的类型是由你在模式里的标注决定的。如果想在两种类型之间转换也很简单:
- 把整数98转成字符串:
<<98>>就能得到"b" - 把字符串"b"转成整数:
<<c::utf8>> = "b",此时c就是98
内容的提问来源于stack exchange,提问作者John Wang
相关产品推荐
相关产品推荐

