Существует множество способов объединения вектора строк:
join
функция
string
функция
*
объединенная функция
как показано различными комментариями.
Однако подписи для этих функций не идентичны. Сначала я этого не заметил, и кто-то еще новичок в Джулии может оценить детали.
julia> j = join(a)
"abc"
julia> s = string(a...)
"abc"
julia> m = *(a...)
"abc"
# When called correctly all three functions return equivalent results.
julia> j == s == m
true
Однако , когда кто-то, как и я, является новичком в Джулии, они могут не сразу признать (я не) критическую важность ...
для строки string
и *
объединенные функции, в отличие от функции join
.
Например:
julia> s2 = string(a)
"[\"a\", \"b\", \"c\"]"
julia> s == s2
false
# or simply:
julia> join(a) == string(a)
false
В чем разница между s = join(a)
и s2 = string(a)
?
# Note that join(a) produces a string of 3 letters, "abc".
julia> length(s)
3
# string(a) produces a string of punctuation characters with the letters.
julia> length(s2)
15
julia> s[1]
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
julia> s2[1]
'[': ASCII/Unicode U+005b (category Ps: Punctuation, open)
julia> s[1:3]
"abc"
julia> s2[1:3]
"[\"a"
Функция конкатенации *()
также сильно отличается от функции join
:
julia> a = ["a", "b", "c"]
3-element Array{String,1}:
"a"
"b"
"c"
julia> j = join(a)
"abc"
julia> m = *(a)
ERROR: MethodError: no method matching *(::Array{String,1})
julia> m = *(a...)
"abc"
Таким образом, оператор "splat", ...
, который используется для применения функции к последовательности аргументов, имеет решающее значение для string
и *
, но не для join
.
Фактически, функция join
с оператором "splat" делает то, что вы, вероятно, не хотите:
julia> join(a...)
"a"