函数内部调用struct报错,但是单独拿到函数外面却没问题

写了如下函数:

function getBCJθ(pJpzJθ, pJpδJθ, pΦpzJθ, pΦpδJθ, zJθ, δJθ, para::Param)
    tmpB=elementcharge .* para.v1 ./ para.centerenergy ./ para.circum .* 𝒱(zJθ, para) .* pJpδJθ .- para.η .* δJθ .* pJpzJθ
    tmpC=elementcharge .* para.v1 ./ para.centerenergy ./ para.circum .* 𝒱(zJθ, para) .* pΦpδJθ .- para.η .* δJθ .* pΦpzJθ
    clight.*tmpB, clight.*tmpC
end

这里Param是我定义的struct

结果报错:

MethodError: no method matching length(::Param)
Closest candidates are:
  length(::Union{Base.KeySet, Base.ValueIterator}) at abstractdict.jl:58
  length(::Union{ZMQ._Message, Base.RefValue{ZMQ._Message}}) at C:\Users\Emma\.julia\packages\ZMQ\R3wSD\src\_message.jl:31
  length(::Union{Tables.AbstractColumns, Tables.AbstractRow}) at C:\Users\Emma\.julia\packages\Tables\fouQB\src\Tables.jl:180
  ...

Stacktrace:
 [1] _similar_for(c::UnitRange{Int64}, #unused#::Type{Any}, itr::Param, #unused#::Base.HasLength)
   @ Base .\array.jl:575
 [2] _collect(cont::UnitRange{Int64}, itr::Param, #unused#::Base.HasEltype, isz::Base.HasLength)
   @ Base .\array.jl:608
 [3] collect(itr::Param)
   @ Base .\array.jl:602
 [4] broadcastable(x::Param)
   @ Base.Broadcast .\broadcast.jl:682
 [5] broadcasted
   @ .\broadcast.jl:1313 [inlined]
 [6] getBCJΦ(pJpzJΦ::Matrix{Float64}, pJpδJΦ::Matrix{Float64}, pΦpzJΦ::Matrix{Float64}, pΦpδJΦ::Matrix{Float64}, zJΦ::Matrix{Float64}, δJΦ::Matrix{Float64}, para::Param)
   @ Main .\In[25]:2
 [7] top-level scope
   @ In[76]:1
 [8] eval
   @ .\boot.jl:360 [inlined]
 [9] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String)
   @ Base .\loading.jl:1116

奇怪的是,如果我将其中一行拿出来单独运行是OK的:

> elementcharge .* param.v1 ./ param.centerenergy ./ param.circum .* 𝒱(zJθ, param) .* pJpδJθ .- param.η .* δJθ .* pJpzJθ

200×400 Matrix{Float64}:
 -2.69241e-18  -3.44829e-15  -6.88023e-15  …  6.88023e-15  3.44829e-15
 -2.69594e-18  -5.93998e-15  -1.19826e-14     1.19826e-14  5.93998e-15
 -4.38725e-18  -9.31931e-15  -1.85839e-14     1.85839e-14  9.31931e-15
 -6.59754e-33  -1.4935e-14   -2.9751e-14      2.9751e-14   1.4935e-14
 -3.53335e-33  -2.03482e-14  -4.1317e-14      4.1317e-14   2.03482e-14
 -4.7654e-18   -2.59762e-14  -5.18763e-14  …  5.18763e-14  2.59762e-14
 -9.88984e-33  -3.45101e-14  -6.88156e-14     6.88156e-14  3.45101e-14
 -6.08881e-18  -4.29024e-14  -8.73901e-14     8.73901e-14  4.29024e-14
 -1.32582e-32  -5.08774e-14  -1.01747e-13     1.01747e-13  5.08774e-14
 -1.90719e-32  -6.41604e-14  -1.28327e-13     1.28327e-13  6.41604e-14
 -2.09048e-33  -7.30096e-14  -1.44692e-13  …  1.44692e-13  7.30096e-14
 -6.29995e-18  -8.88857e-14  -1.78549e-13     1.78549e-13  8.88857e-14
 -1.7473e-17   -1.0848e-13   -2.16933e-13     2.16933e-13  1.0848e-13
  ⋮                                        ⋱               
 -2.12804e-31  -2.37465e-11  -4.8089e-11      4.8089e-11   2.37465e-11
 -1.03896e-32  -2.4018e-11   -4.73568e-11     4.73568e-11  2.4018e-11
 -2.79617e-33  -2.41498e-11  -4.79588e-11  …  4.79588e-11  2.41498e-11
 -1.18342e-32  -2.45182e-11  -4.83747e-11     4.83747e-11  2.45182e-11

在英文论坛找到了一样的情况:
No method matching length() for any dot syntax operation involving a struct - New to Julia - Julia Programming Language (julialang.org)
方法就是一句声明:

Base.broadcastable(x::Param) = Ref(x)

这样就不会对struct进行broadcast