7 fn crazy_closure() -> (i32, i32, i32) {
8 fn inner<T: Copy>(t: T) -> (i32, T, T) {
14 let f = move |y, z, asdf| {
16 (a + b + y + z, asdf, t)
24 fn closure_arg_adjustment_problem() -> i64 {
25 fn once<F: FnOnce(i64)>(f: F) {
36 fn fn_once_closure_with_multiple_args() -> i64 {
37 fn once<F: FnOnce(i64, i64) -> i64>(f: F) -> i64 {
42 let f = |x, z| x + y + z;
47 fn boxed_fn_once(f: Box<dyn FnOnce() -> i32>) -> i32 {
52 let x: Box<dyn Fn(i32) -> i32> = Box::new(|x| x * 2);
53 assert_eq!(x(21), 42);
56 let mut x: Box<dyn FnMut()> = Box::new(|| i *= 2);
63 fn fn_item_as_closure_trait_object() {
65 let f: &dyn Fn() = &foo;
69 fn fn_item_with_args_as_closure_trait_object() {
73 let f: &dyn Fn(i32) = &foo;
77 fn fn_item_with_multiple_args_as_closure_trait_object() {
78 fn foo(i: i32, j: i32) {
83 fn bar(i: i32, j: i32, k: f32) {
86 assert_eq!(k, 3.14159)
88 let f: &dyn Fn(i32, i32) = &foo;
90 let f: &dyn Fn(i32, i32, f32) = &bar;
94 fn fn_ptr_as_closure_trait_object() {
99 fn baa(u: u32, f: f32) {
101 assert_eq!(f, 3.141);
103 let f: &dyn Fn() = &(foo as fn());
105 let f: &dyn Fn(u32) = &(bar as fn(u32));
107 let f: &dyn Fn(u32, f32) = &(baa as fn(u32, f32));
112 assert_eq!(simple(), 12);
113 assert_eq!(crazy_closure(), (84, 10, 10));
114 assert_eq!(closure_arg_adjustment_problem(), 3);
115 assert_eq!(fn_once_closure_with_multiple_args(), 6);
117 boxed_fn_once(Box::new({
125 fn_item_as_closure_trait_object();
126 fn_item_with_args_as_closure_trait_object();
127 fn_item_with_multiple_args_as_closure_trait_object();
128 fn_ptr_as_closure_trait_object();