// Copyright 2012 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. /// A version of the call operator that takes an immutable receiver. /// /// # Examples /// /// Closures automatically implement this trait, which allows them to be /// invoked. Note, however, that `Fn` takes an immutable reference to any /// captured variables. To take a mutable capture, implement [`FnMut`], and to /// consume the capture, implement [`FnOnce`]. /// /// [`FnMut`]: trait.FnMut.html /// [`FnOnce`]: trait.FnOnce.html /// /// ``` /// let square = |x| x * x; /// assert_eq!(square(5), 25); /// ``` /// /// Closures can also be passed to higher-level functions through a `Fn` /// parameter (or a `FnMut` or `FnOnce` parameter, which are supertraits of /// `Fn`). /// /// ``` /// fn call_with_one(func: F) -> usize /// where F: Fn(usize) -> usize { /// func(1) /// } /// /// let double = |x| x * 2; /// assert_eq!(call_with_one(double), 2); /// ``` #[lang = "fn"] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_paren_sugar] #[fundamental] // so that regex can rely that `&str: !FnMut` pub trait Fn : FnMut { /// This is called when the call operator is used. #[unstable(feature = "fn_traits", issue = "29625")] extern "rust-call" fn call(&self, args: Args) -> Self::Output; } /// A version of the call operator that takes a mutable receiver. /// /// # Examples /// /// Closures that mutably capture variables automatically implement this trait, /// which allows them to be invoked. /// /// ``` /// let mut x = 5; /// { /// let mut square_x = || x *= x; /// square_x(); /// } /// assert_eq!(x, 25); /// ``` /// /// Closures can also be passed to higher-level functions through a `FnMut` /// parameter (or a `FnOnce` parameter, which is a supertrait of `FnMut`). /// /// ``` /// fn do_twice(mut func: F) /// where F: FnMut() /// { /// func(); /// func(); /// } /// /// let mut x: usize = 1; /// { /// let add_two_to_x = || x += 2; /// do_twice(add_two_to_x); /// } /// /// assert_eq!(x, 5); /// ``` #[lang = "fn_mut"] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_paren_sugar] #[fundamental] // so that regex can rely that `&str: !FnMut` pub trait FnMut : FnOnce { /// This is called when the call operator is used. #[unstable(feature = "fn_traits", issue = "29625")] extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output; } /// A version of the call operator that takes a by-value receiver. /// /// # Examples /// /// By-value closures automatically implement this trait, which allows them to /// be invoked. /// /// ``` /// let x = 5; /// let square_x = move || x * x; /// assert_eq!(square_x(), 25); /// ``` /// /// By-value Closures can also be passed to higher-level functions through a /// `FnOnce` parameter. /// /// ``` /// fn consume_with_relish(func: F) /// where F: FnOnce() -> String /// { /// // `func` consumes its captured variables, so it cannot be run more /// // than once /// println!("Consumed: {}", func()); /// /// println!("Delicious!"); /// /// // Attempting to invoke `func()` again will throw a `use of moved /// // value` error for `func` /// } /// /// let x = String::from("x"); /// let consume_and_return_x = move || x; /// consume_with_relish(consume_and_return_x); /// /// // `consume_and_return_x` can no longer be invoked at this point /// ``` #[lang = "fn_once"] #[stable(feature = "rust1", since = "1.0.0")] #[rustc_paren_sugar] #[fundamental] // so that regex can rely that `&str: !FnMut` pub trait FnOnce { /// The returned type after the call operator is used. #[stable(feature = "fn_once_output", since = "1.12.0")] type Output; /// This is called when the call operator is used. #[unstable(feature = "fn_traits", issue = "29625")] extern "rust-call" fn call_once(self, args: Args) -> Self::Output; } mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl<'a,A,F:?Sized> Fn for &'a F where F : Fn { extern "rust-call" fn call(&self, args: A) -> F::Output { (**self).call(args) } } #[stable(feature = "rust1", since = "1.0.0")] impl<'a,A,F:?Sized> FnMut for &'a F where F : Fn { extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output { (**self).call(args) } } #[stable(feature = "rust1", since = "1.0.0")] impl<'a,A,F:?Sized> FnOnce for &'a F where F : Fn { type Output = F::Output; extern "rust-call" fn call_once(self, args: A) -> F::Output { (*self).call(args) } } #[stable(feature = "rust1", since = "1.0.0")] impl<'a,A,F:?Sized> FnMut for &'a mut F where F : FnMut { extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output { (*self).call_mut(args) } } #[stable(feature = "rust1", since = "1.0.0")] impl<'a,A,F:?Sized> FnOnce for &'a mut F where F : FnMut { type Output = F::Output; extern "rust-call" fn call_once(mut self, args: A) -> F::Output { (*self).call_mut(args) } } }