Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I use a method or a function as a closure?

Tags:

rust

I have some methods on a struct that I'd like to pass around as parameters. I'm pretty sure the only way to pass around functions is by using closures. Is there a way I can do this without doing || { self.x() }?

like image 484
Kites Avatar asked Sep 30 '15 03:09

Kites


People also ask

Is a function a closure?

A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function's scope from an inner function.

What could be the alternative to closure?

Webpack, Babel, UglifyJS, and TypeScript are the most popular alternatives and competitors to Closure Compiler.

What is difference between closure and function?

Difference between Function and ClosureFunction is declared using func keyword whereas Closure doesn't have func keyword. Function has always name but Closure doesn't have. Function doesn't have in keyword but closure has in the keyword.

Is every function a closure?

Yes, exactly. As you've identified, every function in JavaScript is a closure over at least one context: The global context.


1 Answers

You can absolutely use a method or a function as a closure. You use the full path to the function or method, including trait methods:

A free function:

struct Monster {
    health: u8,
}

fn just_enough_attack(m: Monster) -> u8 {
    m.health + 2
}

fn main() {
    let sully = Some(Monster { health: 42 });
    let health = sully.map(just_enough_attack);
}

An inherent method:

struct Monster {
    health: u8,
}

impl Monster {
    fn health(&self) -> u8 { self.health }
}

fn main() {
    let sully = Some(Monster { health: 42 });
    let health = sully.as_ref().map(Monster::health);
}

A trait method:

fn main() {
    let name = Some("hello");
    let owned_name = name.map(ToOwned::to_owned);
}

Note that the argument type must match exactly, this includes by-reference or by-value.

like image 99
Shepmaster Avatar answered Oct 21 '22 18:10

Shepmaster