Man or boy test: Difference between revisions
Content added Content deleted
Line 2,910: | Line 2,910: | ||
}; |
}; |
||
let b = ||(b.f)(&b); |
let b = ||(b.f)(&b); |
||
if k <= 0 { |
return if k <= 0 {x4() + x5()} else {b()} |
||
return x4() + x5() |
|||
} else { |
|||
return b() |
|||
} |
|||
} |
} |
||
Line 2,923: | Line 2,919: | ||
Another solution that gives a reference-counted function a weak reference to itself: |
Another solution that gives a reference-counted function a weak reference to itself: |
||
{{trans|Objective-C}} |
|||
<lang rust>use std::cell::Cell; |
<lang rust>use std::cell::Cell; |
||
use std::cell::RefCell; |
use std::cell::RefCell; |
||
Line 2,931: | Line 2,928: | ||
let weak_holder: Rc<RefCell<Weak<Fn() -> i32>>> = Rc::new(RefCell::new(Weak::<fn() -> i32>::new())); |
let weak_holder: Rc<RefCell<Weak<Fn() -> i32>>> = Rc::new(RefCell::new(Weak::<fn() -> i32>::new())); |
||
let weak_holder2 = weak_holder.clone(); |
let weak_holder2 = weak_holder.clone(); |
||
let |
let k_holder = Cell::new(k); |
||
let b: Rc<Fn() -> i32> = Rc::new(move || { |
let b: Rc<Fn() -> i32> = Rc::new(move || { |
||
let b = weak_holder2.borrow().upgrade().unwrap(); |
let b = weak_holder2.borrow().upgrade().unwrap(); |
||
k_holder.set(k_holder.get() - 1); |
|||
return a( |
return a(k_holder.get(), &*b, x1, x2, x3, x4); |
||
}); |
}); |
||
weak_holder.replace(Rc::downgrade(&b)); |
weak_holder.replace(Rc::downgrade(&b)); |
||
if k <= 0 { |
return if k <= 0 {x4() + x5()} else {b()} |
||
return x4() + x5() |
|||
} else { |
|||
return b() |
|||
} |
|||
} |
} |
||