Julia :where

一、有where和无where区别

a  = Array{Array{T,1} where T,1}() # Vector

b  = Array{T where T,1}() # Any[0]

a==b # true

c =Array{Array{T where T,1} where T,1}() # Vector{Any}[0]

a==c #true

a==c很奇怪吧。感觉这个设计有些问题。

1、type

ty(a::T) where T = Array{Array{T,1},1} where T;
ty2(a::T) where T  = Array{Array{T,1} where T,1};
ty3(a::T) where T  =Array{Array{T,1},1};

以上三者都不一样。具体如下:

typeof(ty(6.0)) # UnionAll
typeof(ty2(6.0)) # DataType
typeof(ty3(6.0)) # Array{Array{Float64,1},1}
typeof(ty(6.0)) ==typeof(ty2(6.0)) # false

2、数据

f(a::T) where T = Array{Array{T,1},1}()  
f2(a::T) where T  = Array{Array{T,1} where T,1}();
typeof(f2(6.0)) #Array{Array{Float64,1},1}
typeof(f2(6.0)) #Array{Array{T,1} where T,1},是一个类型
typeof(f2(6.0))==typeof(f2(6.0)) # false

具体来看,关于f2(a::T) where T = Array{Array{T,1} where T,1}():

data =f2(6.0);# 只是一个类型
push!(data,[4.0])# 元素1
push!(data,["abc"]) # 元素2,可以不同于元素1

而至于f(a::T) where T = Array{Array{T,1},1}() :

temp =f(6.0)
push!(temp,[6.0])
push!(temp,["abc"]) #=>error!,只能放[Float64]类型。

上面的区别现在容易搞清楚了吧。

二、关于构造函数

在官方文档中,有以下举例:

struct SummedArray{T<:Number,S<:Number}
           data::Vector{T}
           sum::S
           function SummedArray(a::Vector{T}) where T
               S = widen(T)
               new{T,S}(a, sum(S, a))
           end
end

当在Repl中运行以下,会报错。

SummedArray(Int32[1; 2; 3], Int32(6))

加一句,就可以运行:

SummedArray{T<:Number}(a::Vector{T},::T) =  SummedArray(a::Vector{T});

但是,不能加where T

SummedArray{T<:Number}(a::Vector{T},::T) =  SummedArray(a::Vector{T}) where T;# 不能在此加where T
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值