Search code examples
structconstructorjuliawhere-clause

what does the Keyword "where" mean in julia?


struct A{T<:myType}
    arg::T
    arg1
    function A{T}(arg,arg1) where {T}
        
        return new{T}(arg,arg1)
    end
end

my question is, why should I add where {T} beside the inner constructor. Without it I get :T is not defined


Solution

  • You can search for where in the REPL's help mode (accessed by pressing ?)

    help?> where
    search: where @where with_logger
    
      where
    
      The where keyword creates a type that is an iterated union of other types, over 
      all values of some variable. For example Vector{T} where T<:Real includes all 
      Vectors where the element type is some kind of Real number.
    
      The variable bound defaults to Any if it is omitted:
    
      Vector{T} where T    # short for `where T<:Any`
    
      Variables can also have lower bounds:
    
      Vector{T} where T>:Int
      Vector{T} where Int<:T<:Real
    
      There is also a concise syntax for nested where expressions. For example, this:
    
      Pair{T, S} where S<:Array{T} where T<:Number
    
      can be shortened to:
    
      Pair{T, S} where {T<:Number, S<:Array{T}}
    
      This form is often found on method signatures.
    
      Note that in this form, the variables are listed outermost-first. This matches 
      the order in which variables are substituted when a type is "applied" to 
      parameter values using the syntax T{p1, p2, ...}.
    

    The reason you need to add the where {T} at the end of your function signature is that A is a parametric type with parameter T. If you leave only the A{T}, the function assumes you creating an instance of type A with parameter T, but T has not yet been defined. By adding the where {T}, you let the constructor know that T will be passed to the function as a parameter when it is called, not when it is defined.