两个Elixir推导式的差异及字符串与ASCII互转机制疑问
Elixir两个推导式的差异解析
首先明确Elixir里的核心概念:
- Elixir的字符串本质是UTF-8编码的二进制,比如"abc"底层对应
<<97,98,99>>。 - 字符列表(charlist)是整数的列表,每个整数对应一个Unicode码点(ASCII是Unicode子集,所以ASCII字符的码点就是它的ASCII值),比如
'abc'等价于[97,98,99]。
第一个推导式:二进制生成器处理
result = for << n <- "abc132" >>, do: n + 1 IO.puts(result) # 输出bcd243
- 这里的
<< n <- "abc132" >>是二进制生成器,会逐个提取字符串(二进制)里的每个字节。因为"abc132"都是ASCII字符,每个字符占1字节,所以n就是每个字符对应的ASCII整数值(比如'a'对应97)。 - 推导式的返回值会自动打包成二进制:每个
n+1得到的整数,会被当作UTF-8字节(ASCII范围内的整数直接对应字符),最终result是<<98,99,100,50,51,52>>,也就是字符串"bcd243",所以IO.puts直接输出字符。
第二个推导式:列表生成器处理
string = "abc123" for n <- String.to_charlist(string) do IO.puts(n+1) # 输出98,99,100,50,51,52 end
String.to_charlist(string)把字符串转成了字符列表[97,98,99,49,50,51],推导式用的是列表生成器,遍历这个整数列表,n就是每个字符对应的码点整数。- 这里的
IO.puts(n+1)是直接输出整数的字符串形式,因为IO.puts接收整数时,会把它转成数字字符串打印,而不是转成字符。如果想要输出字符,需要把整数转成二进制,比如改成IO.puts(<<n+1>>),就能得到和第一个推导式类似的字符输出。
两者核心差异
- 生成器类型不同:一个操作二进制(字符串),一个操作整数列表(字符列表)。
- 返回值/输出逻辑不同:第一个推导式自动把整数结果打包成二进制字符串;第二个直接输出整数,没有做字符转换。
内容的提问来源于stack exchange,提问作者miccx
相关产品推荐
相关产品推荐

