Я хотел проверить, как абстрактный тип работает в «strcutres», поэтому я создал структуру ниже с помощью конструктора, однако в возвращаемом сообщении отображается «ОШИБКА: MethodError: нет метода, соответствующего Rect (:: Int64)».
Я не знаю, какая часть пошла не так, хотя параметр «5», который я использовал, соответствует определению конструктора, который представляет собой одно целое число. Спасибо.
abstract type Shape{T<:Integer,F<:AbstractFloat} end
export Shape
struct Rect{T,F} <: Shape{T,F}
a::T
b::T
c::T
v::F
function Rect{T,F}(a::T) where {T<:Integer, F<:AbstractFloat}
b = 10;
c = 10;
v = a*b*c;
return new(a,b,c,v)
end
end
function main()
vol = Rect(5).v;
println(vol)
end
main()
Он должен возвращать произведение a, b и c, причем только a является входной переменной.





У вас нет соответствующего конструктора. Ты должен сделать:
julia> Rect{Int,Float64}(5)
Rect{Int64, Float64}(5, 10, 10, 500.0)
Другой вариант - добавить конструктор в вашу структуру:
function Rect{T}(a::T) where {T<:Integer}
Rect{Int,Float64}(a)
end
Как только вы добавите конструктор, вы можете сделать:
julia> Rect{Int}(5)
Rect{Int64, Float64}(5, 10, 10, 500.0)
Или вы также можете определить:
Rect(a::Int) = Rect{Int,Float64}(a)
и имеют
julia> Rect(5)
Rect{Int64, Float64}(5, 10, 10, 500.0)
Большое спасибо! После добавления конструктора в строке Rect{Int,Float64}(a) вызывается функция-конструктор Rect{T,F}(a::T)... Я ранее определил?
Да, точно. Вы также можете определить для удобства что-то вроде `Rect(a::Int) = Rect{Int,Float64}(a)`
Имея только аргумент типа
T, как конструктор узнает, какой типF? ПопробуйтеRect{Int64,Float64}(5).v