Rust’s From and Into traits are great.
Once you implemented one of them, they allow you to convert between two types simply by calling either Target::from(source)
or source.into()
.
In previous posts you might have noticed the deeply nested constructions of Item
s such as:
fn offer(&mut self, _pos: &PosRelative) -> Option<Item> {
self.product
.take()
.map(|x| Item::Material(Material::Plate(x)))
}
}
This is caused due to the definition of the Item
type:
pub enum Item {
Material(Material),
Structure(Structure),
...
}
pub enum Material {
Ore(Ore),
Plate(Plate),
...
}
pub enum Plate {
Iron,
Copper,
}
To e.g. construct an Item
from a Plate
one has to also mention the intermediate Material
type.
This is quite annoying to type and reduces the readability of the code.
But once the From
conversion is implemented:
impl From<Plate> for Item {
fn from(x: Plate) -> Self {
Self::Material(Material::Plate(x))
}
}
The previously long construction can be simplified to a single .into()
call:
fn offer(&mut self, _pos: &PosRelative) -> Option<Item> {
self.product.take().map(|x| x.into())
}
Due to the many conversions within Factor Y
from specific types such as Plate
to more generic ones such as Material
or even Item
, using From
or Into
is incredibly helpful.