我遇到了一个无法解释的现象。我的代码用结构体传递几个参数。有些函数能正常接收,另一个却不行。也许其他人能看出我漏掉的错误。
这个 MWE 看起来都正常,直到最后一行报错。
using FlexUnits: QuantFieldVector, DimsMod
using Revise
gravity = 9.81u"m/s^2"
net_load(diameter, config) = @. 2*config.initial_load*(sin(acos((config.drum+config.gap)/(config.drum+diameter)))) - π/4*(diameter^2 - config.core^2)*config.density*gravity
limited_load(diameter, config) = max.(net_load(diameter, config), config.min_load)
line_load(diameter, config) = @. (π/4*(diameter^2 - config.core^2)*config.density*gravity + limited_load(diameter, config))/(2*sin(acos((config.drum+config.gap)/(config.drum+diameter))))
mutable struct Carrier{T} <: QuantFieldVector{7,T}
drum::Quantity{T, D"m"}
gap::Quantity{T, D"m"}
core::Quantity{T, D"m"}
span::Quantity{T, D"m"}
min_load::Quantity{T, D"N/m"}
initial_load::Quantity{T, D"N/m"}
density::Quantity{T, D"kg/m^3"}
end
config = Carrier(26u"in", 31u"mm", 110u"mm", 1.4u"m", 5u"lbf/in",14u"lbf/in", 860u"kg/m^3")
transition_diameter = 0.9u"m"
config.initial_load
net_load(440u"mm", config)
limited_load(440u"mm", config)
line_load(440u"mm", config)
ERROR: FieldError: type Float64 has no field `initial_load`; Float64 has no fields at all.
Stacktrace:
[1] getproperty
@ .\Base_compiler.jl:57 [inlined]
[2] net_load(diameter::Quantity{Float64, StaticDims{m}}, config::Float64)
@ Main .\REPL[83]:2
[3] limited_load(diameter::Quantity{Float64, StaticDims{m}}, config::Float64)
@ Main .\REPL[82]:2
从英语翻译·查看原文I've encountered something I can't explain. My code passes several parameters around in a struct. Some functions accept it successfully, while another doesn't. Perhaps somebody else can spot the mistake I'm missing.
Everything in this MWE appears fine until the final line raises an error.
using FlexUnits: QuantFieldVector, DimsMod
using Revise
gravity = 9.81u"m/s^2"
net_load(diameter, config) = @. 2*config.initial_load*(sin(acos((config.drum+config.gap)/(config.drum+diameter)))) - π/4*(diameter^2 - config.core^2)*config.density*gravity
limited_load(diameter, config) = max.(net_load(diameter, config), config.min_load)
line_load(diameter, config) = @. (π/4*(diameter^2 - config.core^2)*config.density*gravity + limited_load(diameter, config))/(2*sin(acos((config.drum+config.gap)/(config.drum+diameter))))
mutable struct Carrier{T} <: QuantFieldVector{7,T}
drum::Quantity{T, D"m"}
gap::Quantity{T, D"m"}
core::Quantity{T, D"m"}
span::Quantity{T, D"m"}
min_load::Quantity{T, D"N/m"}
initial_load::Quantity{T, D"N/m"}
density::Quantity{T, D"kg/m^3"}
end
config = Carrier(26u"in", 31u"mm", 110u"mm", 1.4u"m", 5u"lbf/in",14u"lbf/in", 860u"kg/m^3")
transition_diameter = 0.9u"m"
config.initial_load
net_load(440u"mm", config)
limited_load(440u"mm", config)
line_load(440u"mm", config)
ERROR: FieldError: type Float64 has no field `initial_load`; Float64 has no fields at all.
Stacktrace:
[1] getproperty
@ .\Base_compiler.jl:57 [inlined]
[2] net_load(diameter::Quantity{Float64, StaticDims{m}}, config::Float64)
@ Main .\REPL[83]:2
[3] limited_load(diameter::Quantity{Float64, StaticDims{m}}, config::Float64)
@ Main .\REPL[82]:2