Массив внутри типа в julia

#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 .