livingcoder

joined 2 years ago
[–] livingcoder@programming.dev 3 points 3 months ago* (last edited 3 months ago) (2 children)

Basically, you can generalize your trait types into their parent (super) traits for situations when functionality is specific to those supertrait objects.

As an example, if you have a trait CanBark and it is a super trait for the trait IsDog, you can coerce your references of &dyn IsDog into a &dyn CanBark. You can then work with other trait types that share a super trait.

trait CanBark {
    fn bark(&self);
}
trait IsSeal: CanBark { }
trait IsDog: CanBark { }

fn bark_as_group(barkers: &Vec<&dyn CanBark>) {
    for barker in barkers {
        barker.bark();
    }
}

let spot: &dyn IsDog = get_spot();
let seal: &dyn IsSeal = get_seal();
let barkers: Vec<&dyn CanBark> = Vec::new();
barkers.push(spot);  // coerced
barkers.push(seal);  // coerced
bark_as_group(&barkers);

At least, I hope this is possible now. If it's purely "you can return a coerced type from a function", that is less useful.

[–] livingcoder@programming.dev 3 points 3 months ago

I think this prediction will age extremely well if we last that long. That's a very big "if".

[–] livingcoder@programming.dev 11 points 4 months ago* (last edited 4 months ago) (4 children)

Wow, that trait feature is great. I've been eagerly waiting for that one for a long time. Thank you to everyone who made that possible.

[–] livingcoder@programming.dev 1 points 4 months ago* (last edited 4 months ago)

I kept most of my bindings the same as the normal QWERTY keyboard, so I don't have much of an issue swapping between them. I had debated a lot about changing to other keyboard layouts and I'm really glad that I didn't.

[–] livingcoder@programming.dev 5 points 4 months ago (2 children)

I love my Moonlander. I'll never go back.

[–] livingcoder@programming.dev 2 points 4 months ago

I've found that one of the best things to do when making a library for something that is going to have a web interface is to first have it work in the terminal. You can much more quickly play around with the design and fix issues there instead of having to work with a more complex web interface.

You just create a simple menu system, like input("1: Feature A\n2: Feature B\n>") and just start trying out all of the different scenarios and workflows.

[–] livingcoder@programming.dev 4 points 4 months ago* (last edited 4 months ago)

I had a coworker who would sometimes not create a method as being static to the class and would therefore need to create a default instance to call said method. "It's domain-driven design."

[–] livingcoder@programming.dev 6 points 4 months ago

The price and quality are so hard to beat.

[–] livingcoder@programming.dev 1 points 4 months ago (1 children)

Sounds good. Please share what you find and what you end up going with.

[–] livingcoder@programming.dev 4 points 4 months ago (3 children)

There are a few different ways to solve this problem without using unsafe and I'm not sure what would be considered idiomatic. Another option is to ultimately encapsulate all of the nodes in a reference-counted box like Rc or Arc and specify the type of your parent/child/sibling references to the same reference-counted box type. With that, you just share cloned instances around as needed.

The primary drawback here is that for mutable access you end up having to perform a lock every time on an underlying Mutex (or something similar). You also no longer have direct access to the singular instance of the node.

There are pros and cons to every approach.

[–] livingcoder@programming.dev 4 points 4 months ago* (last edited 4 months ago) (5 children)

One way of solving this is to structure all of your nodes into a HashMap with the node ID as the key and the node type as the value. The underlying node type could have node IDs for referencing purposes. You lose the ability to reference the parent/child/sibling directly, but you avoid direct circular dependencies. That said, now you need to manage dangling references for when the node is removed from the main HashMap collection.

view more: ‹ prev next ›