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 k1 = Cell::new(k);
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();
k1.set(k1.get() - 1);
k_holder.set(k_holder.get() - 1);
return a(k1.get(), &*b, x1, x2, x3, x4);
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()
}
}
}