Quelle est la signification de <: in julia? [dupliquer]

Nov 20 2020

Quelqu'un peut-il m'aider avec ce code:

struct GenericPoint{T<:Real}
x::T
y::T
end

Quel est le sens de <:in {T<:Real}à Julialang?

Réponses

8 FrançoisFévotte Nov 19 2020 at 23:42

Permettez-moi de commencer par dire que la page de ponctuation du manuel est un moyen pratique de rechercher de tels opérateurs, qui sont par ailleurs très difficiles à rechercher à l'aide d'un moteur de recherche. Dans le cas spécifique de <:, nous trouvons cette page, avec la documentation pertinente pour les opérateurs essentiels .

Il y a (au moins) 3 contextes où A <: Bpourrait être utilisé, et dans chacun d'eux cela exprime l'idée qui Aest un sous-type de B.

  1. comme prédicat, A <: Brenvoie truesi et seulement si toutes les valeurs de type Asont également de type B:
julia> Int <: Number
true

julia> Int <: AbstractString
false
  1. dans une définition de type, cela déclare que le type nouvellement défini est un sous-type d'un type existant (abstrait):
# `Foo` is declared to be a subtype of `Number`
struct Foo <: Number
end
  1. en tant que contrainte de paramètre de type (comme dans votre exemple), T <: Realexprime l'idée que le paramètre de type Tpeut être n'importe quel sous-type de Real:
julia> struct GenericPoint{T<:Real}
           x::T
           y::T
       end

# Works because 1 and 2 are of type Int, and Int <: Real
julia> GenericPoint(1, 2)
GenericPoint{Int64}(1, 2)

# Does not work because "a" and "b" are of type String,
# which is not a subtype of Real
julia> GenericPoint("a", "b")
ERROR: MethodError: no method matching GenericPoint(::String, ::String)
Stacktrace:
 [1] top-level scope at REPL[5]:1

Notez que l'utilisation des contraintes de paramètre de type ne se limite pas à la définition de types paramétriques, mais s'applique également aux définitions de fonction / méthode:

julia> foo(x::Vector{T}) where {T<:Number} = "OK"
foo (generic function with 1 method)

# OK because:
# - [1,2,3] is of type Vector{Int}, and
# - Int <: Number
julia> foo([1, 2, 3])
"OK"

# Incorrect because:
# - ["a", "b", "c"] is of type Vector{String}, but
# - String is not a subtype of Number
julia> foo(["a", "b", "c"])
ERROR: MethodError: no method matching foo(::Array{String,1})