n
次元形状を表す単純型を定義したいと考えています。タイプパラメータはn
です。ジュリアの強制積分型パラメータ
julia> struct Shape{n}
name::String
end
julia> square = Shape{2}("square")
Shape{2}("square")
julia> cube = Shape{3}("cube")
Shape{3}("cube")
julia> dim(::Shape{n}) where n = n
dim (generic function with 1 method)
julia> dim(cube)
3
このソリューションが作業を行いますが、それは問題なくn
の非整数値を受け入れます。
julia> Shape{'?'}("invalid")
Shape{'?'}("invalid")
私の最初に考えたのはstruct
宣言でn
に制約を使用することでした。しかし、私はこれを達成すべきだと思った方法もどちらもうまくいかなかったようです。
julia> struct Shape{n} where n <: Int
name::String
end
ERROR: syntax: invalid type signature
julia> struct Shape{n<:Int}
name::String
end
julia> Shape{2}("circle")
ERROR: TypeError: Shape: in n, expected n<:Int64, got Int64
また、内部コンストラクタを使用してみましたが、これはどちらかと思われませんでした。
julia> struct Shape{n}
Shape{n}(name) where n <: Int = new(name)
name::String
end
julia> Shape{2}("circle")
ERROR: MethodError: Cannot `convert` an object of type String to an object of type Shape{2}
This may have arisen from a call to the constructor Shape{2}(...),
since type constructors fall back to convert methods.
Stacktrace:
[1] Shape{2}(::String) at ./sysimg.jl:24
私はJulia 0.6.0-rc3.0
を使用しています。
希望の動作を達成するにはどうすればよいですか?
このために内部コンストラクタが機能します。どのようなコードを使用しましたか? –
@ChrisRackauckas謝罪;私はそのコードをコピーするのを忘れてしまったようです。投稿が更新されました。 –
'N'の型はIntですが、'