Julia append! () Невозможно `преобразовать` объект типа Char в объект типа String - PullRequest
3 голосов
/ 17 мая 2019

Я пытаюсь добавить строку в массив следующим образом:

arry = String[]
append!(arry, "test")

но я получаю следующую ошибку:

Cannot `convert` an object of type Char to an object of type String

Почему я получаю эту ошибку, когда добавляю String, а не Char?

(публикуя свой собственный ответ ниже для пользы других новичков Джулии - всем, у кого есть более полезные советы, прыгайте!)

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Я не вижу вашего ответа, но вот типичный шаблон.

Вы можете push! отдельный элемент или append! коллекция:

julia> arry = String[]
0-element Array{String,1}

julia> push!(arry, "test")
1-element Array{String,1}:
 "test"

julia> append!(arry, ("test",))
2-element Array{String,1}:
 "test"
 "test"

julia> append!(arry, ["test"])
3-element Array{String,1}:
 "test"
 "test"
 "test"

julia> append!(arry, Ref("test"))
4-element Array{String,1}:
 "test"
 "test"
 "test"
 "test"

Обратите внимание, что коллекцияможет быть, например, Tuple, Vector или Ref (который является своего рода 0-мерной и не выделяющей коллекцию, которая часто встречается при вещании).

2 голосов
/ 17 мая 2019

Вы должны использовать push!(), а не append!().

append!() всегда обрабатывает свой аргумент как итератор, тогда как push()! обрабатывает аргумент как отдельный объект, который добавляется как целая единица. Поскольку строки Julia являются итераторами (где каждый символ повторяется как Char), ваша «тестовая» строка повторяется Char от Char. Поскольку вы указали свой массив как строковый тип, Джулия выполняет проверку типа объектов, которые вы вставляете в массив; вот почему вы получили ошибку.

Для тех, кто пришел из Python, push!() Джулии является более близким эквивалентом append().

Python.

Итак, вот как отличается поведение двух функций в массиве Any (что в основном позволяет добавлять любой тип):

# using append!():
arry = Any["a"]
append!(arry, "test")
# result == ["a", 't', 'e', 's', 't'] (a String and four Chars)

# using push!():
arry = Any["a"]
push!(arry, "test")
# result == ["a", "test"] (two Strings)
...