uom
uom copied to clipboard
Improve documentation regarding Kinds
Original title: Can't create a MolarConcentration from AmountOfSubstance / Volume
I have a need to take a MolarConcentration
as a function parameter. However, I'm running into this problem:
use uom::si::f64::*;
use uom::si::volume::liter;
use uom::si::amount_of_substance::mole;
fn foo(concentration: MolarConcentration) {
// do something with concentration
}
fn main() {
let amt = AmountOfSubstance::new::<mole>(1.0);
let vol = Volume::new::<liter>(1.0);
foo(amt / vol); // this fails to compile
}
mismatched types
expected trait `uom::si::marker::ConstituentConcentrationKind`, found trait `uom::Kind`
note: expected struct `uom::si::Quantity<(dyn uom::si::Dimension<Kind = (dyn uom::si::marker::ConstituentConcentrationKind + 'static), J = uom::typenum::Z0, M = uom::typenum::Z0, T = uom::typenum::Z0, I = uom::typenum::Z0, Th = uom::typenum::Z0, L = uom::typenum::NInt<uom::typenum::UInt<uom::typenum::UInt<uom::typenum::UTerm, uom::typenum::B1>, uom::typenum::B1>>, N = uom::typenum::PInt<uom::typenum::UInt<uom::typenum::UTerm, uom::typenum::B1>>> + 'static), (dyn uom::si::Units<f64, time = uom::si::time::second, mass = uom::si::mass::kilogram, luminous_intensity = uom::si::luminous_intensity::candela, amount_of_substance = uom::si::amount_of_substance::mole, electric_current = uom::si::electric_current::ampere, thermodynamic_temperature = uom::si::thermodynamic_temperature::kelvin, length = uom::si::length::meter> + 'static), _>`
found struct `uom::si::Quantity<(dyn uom::si::Dimension<Kind = (dyn uom::Kind + 'static), J = uom::typenum::Z0, M = uom::typenum::Z0, T = uom::typenum::Z0, I = uom::typenum::Z0, Th = uom::typenum::Z0, L = uom::typenum::NInt<uom::typenum::UInt<uom::typenum::UInt<uom::typenum::UTerm, uom::typenum::B1>, uom::typenum::B1>>, N = uom::typenum::PInt<uom::typenum::UInt<uom::typenum::UTerm, uom::typenum::B1>>> + 'static), dyn uom::si::Units<f64, time = uom::si::time::second, mass = uom::si::mass::kilogram, luminous_intensity = uom::si::luminous_intensity::candela, amount_of_substance = uom::si::amount_of_substance::mole, electric_current = uom::si::electric_current::ampere, thermodynamic_temperature = uom::si::thermodynamic_temperature::kelvin, length = uom::si::length::meter>, _>`
The types don't match up, but it seems like they should.
Works fine for other types like Velocity
:
fn foo(speed: Velocity) {
// do something with speed
}
fn main() {
let len = Length::new::<kilometer>(1.0);
let time = Time::new::<second>(1.0);
foo(len / time); // works!
}
The kinds currently need to be transformed via From/Into
, e.g. you could try
foo((amt / vol).into());
or
fn foo(concentration: impl Into<MolarConcentration>) { ... }
Ah okay, I wasn't aware of this! Thank you.
Consider adding a section to the docs about this and for which types it applies to.