Skip to content

Support defaultable types for adding table rows #442

@molpopgen

Description

@molpopgen

The following pseudo code shows how struct update syntax can be used to provide API sugar w/o default arguments:

#[derive(Copy, Clone, Debug, Hash)]
struct NodeDefaults {
    flags: i32,
    population: i32,
    individual: i32,
}

impl Default for NodeDefaults {
    fn default() -> Self {
        Self {
            flags: 0,
            population: -1,
            individual: -1,
        }
    }
}

fn add_node_with_defaults(_time: f64, _defaults: NodeDefaults) {}

fn main() {
    add_node_with_defaults(0.0, NodeDefaults::default());

    let defaults = NodeDefaults {
        population: 2,
        ..Default::default()
    };
    assert_eq!(defaults.population, 2);
    assert_eq!(defaults.individual, -1);
    add_node_with_defaults(0.0, defaults);
    // Type is Copy, so we can re-use
    add_node_with_defaults(0.0, defaults);

    let defaults2 = NodeDefaults {
        individual: 2,
        ..defaults
    };
    assert_eq!(defaults2.population, 2);
    assert_eq!(defaults2.individual, 2);
    add_node_with_defaults(0.0, defaults2);
}

See this blog post for discussion.

Metadata

Metadata

Assignees

No one assigned

    Labels

    APIAPI. issuesenhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions