#arrays #types #julia
#массивы #типы #julia
Вопрос:
Я пытаюсь создать тип с массивом внутри, но у меня возникают проблемы с этим.
Это мой код:
type Gradient
color::GrandientPoint
Gradient(color=[]) = new(color)
function Gradient(rgb::RGB)
push!(color,GrandientPoint(rgb,0))
end
end
Я получаю эту ошибку
ОШИБКА: UndefVarError: цвет не определен
Что я делаю не так?
Ответ №1:
function Gradient(rgb::RGB)
push!(color,GrandientPoint(rgb,0))
end
Вы никогда не создавали color
здесь, поэтому вы не можете push!
войти color
, поскольку он не существует. На самом деле, вам не нужно. Чтобы определить тип, вы просто вызываете new
со значениями для него:
function Gradient(rgb::RGB)
new(GrandientPoint(rgb,0))
end
это создает, Gradient
где первое поле получает значение GrandientPoint(rgb,0)
и возвращает его.
Если бы вам нужен был массив, то ваш тип был бы
type Gradient
color::Vector{GrandientPoint}
end
не просто точка перехода. Теперь вы можете создать этот вектор, используя его конструктор. Типы имеют разумный конструктор из имени своего типа. Итак, чтобы создать Vector{GrandientPoint}
, вы просто делаете
Vector{GraidentPoint}()
и вы можете поместить туда что угодно. Полный код с конструктором:
type Gradient
color::Vector{GrandientPoint}
Gradient(color=[]) = new(Vector{GradientPoint}())
function Gradient(rgb::RGB)
color = Vector{GradientPoint}()
push!(color,GrandientPoint(rgb,0))
new(color)
end
end
Комментарии:
1. Но это создает массив? как я могу добавить к нему элементы?
2. Обратите внимание, что @exsnake, вероятно, хочет
Vector{GradientPoint}
, если я правильно понимаю. (Отсюдаnew(color)
сcolor[]
.)3. Ах, это придает названию больше смысла. Да, в его / ее исходной задаче не было векторов. Я отредактировал ответ, чтобы включить массивы на случай, если это то, чего он / она хотел.
4. Я не понимаю одной вещи. Что происходит
new(color)
?5.
new(color)
создает новый объект Gradient, где первое поле содержит переменнуюcolor
. Однако это не обязательно должно быть одно и то же имя. Если бы мы это сделалиcolor2 = Vector{GradientPoint}(); push!(color,GrandientPoint(rgb,0))
, тоnew(color2)
создали бы новый грайдент, где.color
было бы то, что мы создали какcolor2
.