openlang

Почему вместо моей структуры появляется Float64?

Я столкнулся с чем-то непонятным. Мой код передаёт несколько параметров в структуре. Одни функции принимают её успешно, а другая — нет. Возможно, кто-то со стороны заметит ошибку, которую я упускаю.

В этом 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
Переведено с английскогоПоказать оригинал

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Последняя строка вызывает limited_load.(diameter, config). Поскольку config можно перебирать, broadcasting здесь работает примерно как [limited_load(diameter, item) for item in config]. Каждый item, по-видимому, содержит value* одного из полей с типом Float64 (T). Затем ваш net_load обращается к item.initial_load у этого Float64.

    *Правка: Этот справочник (https://deduction42.github.io/FlexUnits.jl/stable/types/#QuantFieldArrray) подтверждает, что в отличие от getproperty, getindex возвращает числовой скаляр, а не Quantity.

    В целом я не люблю макрос @., потому что он скрывает, какие именно операции вы собирались транслировать по элементам, и приводит к подобным ошибкам. (Да и в чём-то вроде π ./ 4 реальной необходимости нет.)

    Вообще я не понимаю, зачем здесь broadcasting в line_load, limited_load или net_load. Например, в последней из них все переменные справа в определении вроде бы скалярные? Я не знаю смысла этих уравнений, но

    julia> 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))))
    line_load (generic function with 1 method)
    
    julia> line_load(440u"mm", config)
    2451.775693450669 kg/s²

    работает без проблем (даже если оставить потенциально лишний broadcasting в limited_load и net_load).

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Как унаследовать класс внутри другого класса?

    Здравствуйте, В пакете, код которого я не могу менять, есть такая иерархия классов: Я хочу добавить удобную обёртку вокруг In…

    Ответы 1Последняя активность scala
  2. Сравнение привязок have и let в Lean4

    Я заметил, что эти два выражения и ведут себя одинаково. То же происходит при доказательстве теорем. Они взаимозаменяемы? В ч…

    Ответы 3Последняя активность lean-4
  3. Инициализация TypeScript Map со значениями в виде массивов строк

    Создаю Map, в котором каждая запись содержит массив строк. Как одновременно задать его тип и инициализировать одним выражение…

    Ответы 2Последняя активность typescript