【问题标题】:Integer in list printed as "\v"?列表中的整数打印为“\v”?
【发布时间】:2018-08-18 16:11:49
【问题描述】:

有人能解释一下 Erlang 的这种意外的列表理解奇怪吗?

4> [A+B || [A, B] <- [1, 2, 3, [5, 6]]].
"\v"

预期:11

得到:"\v"

必须做什么才能获得预期的输出?

【问题讨论】:

标签: erlang list-comprehension


【解决方案1】:

根据Erlang documentation

字符串是代码点列表、带有 UTF-8 编码代码点的二进制文件(UTF-8 二进制文件)或两者的混合。

"abcd"               % is a valid string  
<<"abcd">>           % is a valid string  
["abcd"]             % is a valid string  
<<"abc..åäö"/utf8>>  % is a valid string  
<<"abc..åäö">>       % is NOT a valid string,  
                     % but a binary with Latin-1-encoded codepoints  
[<<"abc">>, "..åäö"] % is a valid string  
[atom]               % is NOT a valid string

所以在上面你得到了一个列表中的整数 11 或[11]

Eshell V8.3  (abort with ^G)
1> [A+B || [A, B] <- [1, 2, 3, [5, 6]]].
"\v"
%% With hd/1 function you can get first element (head) of a list
2> hd([A+B || [A, B] <- [1, 2, 3, [5, 6]]]).
11
3> [11].
"\v"

Erlang VM 以字符串的形式打印一个可打印的列表。目前它支持两个可打印范围。 latin1 是默认值,unicode

$ erl
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V8.3  (abort with ^G)
1> io:printable_range().
latin1

您可以使用+pc 标志将latin1 更改为unicode

$ erl
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V8.3  (abort with ^G)
1> [1662]. %% not printable in latin1 range
[1662]
2> 
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
a
$ erl +pc unicode
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.3  (abort with ^G)
1> [1662].
"پ"
2>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2023-03-03
    • 2016-04-23
    相关资源
    最近更新 更多