C# can also do something like that with its extension methods. The difference
between Ruby, C# and Rust is that in Rust you explicitly need to use the
trait definition before being able to use the implementation. That prevents 3rd
party code from intentionally or accidentally "polluting" your namespace.

I updated the code on Github
with the trait based implementation. I wasn't able to do the same for the dot
product, because I got stuck in the Rust generics system... If you know how to
do it, I'd be interested in learning :)