在 Julia 中,为什么字符串有时会显示为字符的迭代器而不是集合?

In Julia, why does a string sometimes present as an iterator of characters but not a collection?

在 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() 一起使用是否错误,因为它会导致更长的执行时间或更大的内存使用量?

原因是mapfilterAbstractString有特殊的实现。他们迭代一个字符串和return一个字符串。因此,在map中要求你传递的函数returns 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