uom icon indicating copy to clipboard operation
uom copied to clipboard

Improve documentation regarding Kinds

Open rsivek opened this issue 4 years ago • 3 comments

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.

rsivek avatar Feb 12 '21 04:02 rsivek

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!
}

rsivek avatar Feb 12 '21 04:02 rsivek

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>) { ... }

adamreichold avatar Feb 12 '21 07:02 adamreichold

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.

rsivek avatar Feb 12 '21 13:02 rsivek