在Julia中,字符串被视为迭代器(传递字符(的例子如下:
number = "1234"
notnumber = "123z"
isgood = all(isdigit, number) # true
isobad = all(isdigit, notnumber) # false
isgood = mapreduce(isdigit, &, number) # also true
isbad = mapreduce(isdigit, &, notnumber) # also false
myhex = mapreduce(codepoint, &, number) # 0x00000030
avector = map(codecode, collect(number))
但这并不起作用,尽管isdigit((和codepoint((具有非常相似的签名:
avector = map(codepoint, number) # causes error
为什么有时需要对字符串使用collect((?如果答案是因为all((和mapreduce((占用iter,map((占用collection,请解释区别?
将collect((与map((一起使用是错误的吗?因为这会导致更长的执行时间或更大的内存使用率?
原因是map
和filter
对AbstractString
有一个特殊的实现。它们迭代一个字符串,返回一个字符串。因此,在map
中,您传递的函数必须返回AbstractChar
。这里有一个例子:
julia> x = "a12b3"
"a12b3"
julia> map(uppercase, x)
"A12B3"
以及filter
的类似示例:
julia> filter(isdigit, x)
"123"
现在,如果你不想让字符串作为map
的结果,而是一个向量,那么就使用collect
(正如你所注意到的,这很昂贵(,或者使用一个理解:
julia> [codepoint(c) for c in x]
5-element Vector{UInt32}:
0x00000061
0x00000031
0x00000032
0x00000062
0x00000033