Skip to content

Closure-level inline constants #3687

Open

Description

@sojuz151

I propose to add closure-level inline constants. For example the following code

let closeure_uuid = Uuid::new_v4();
let lambda = ||  {
println!("Execution UUID {}",Uuid::new_v4());
println!("Closure UUID {}",closeure_uuid);
};
lambda ();
lambda ();

It could be rewritten as

let lambda = ||  {
println!("Execution UUID {}",Uuid::new_v4());
println!("Closure UUID {}",cc{Uuid::new_v4())});
};
lambda ();
lambda ();

with a new cc keyword similar to constant. This would have similar advantages as inline_const rust-lang/rust#104087. Use cases:

Finer control on what is getting moved inside the lambda. For example

cc{very_larnge_vector.iter().min()}

or

cc{struct.field.other_filed}

More ergonomic dealing with ref counting. Example:

cc{button.clone()}.enable();

Those expressions should be executed when the closure is created and dropped when the closure is dropped.

Activity

  1. workingjubilee commented on Sep 24, 2024

    @workingjubilee
    Member

    I don't understand the proposal tbh, is this just an abbreviated syntax for const {}?

  2. kennytm commented on Sep 24, 2024

    @kennytm
    Member

    this is like one of the capturing alternatives proposed in #3680 (comment).

    as explained in #3680 (comment) it is very hard to grasp the scope/lifetime of the cc {}'ed expression for newcomers.

  3. workingjubilee commented on Sep 24, 2024

    @workingjubilee
    Member

    ah, I see. thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions