Enum magnus::block::YieldSplat
source · pub enum YieldSplat<I> {
Iter(I),
Enumerator(Enumerator),
}
Expand description
Helper type for functions that either yield an array to a block or return an Enumerator.
I
must implement Iterator<Item = RArray>
.
§Examples
use magnus::{
block::{block_given, YieldSplat},
define_global_function, eval, method,
prelude::*,
rb_assert, RArray, Value,
};
fn count_to_3_abc(rb_self: Value) -> YieldSplat<impl Iterator<Item = RArray>> {
if block_given() {
YieldSplat::Iter((1..=3).zip('a'..='c').map(|(i, c)| {
let ary = RArray::new();
ary.push(i).unwrap();
ary.push(c).unwrap();
ary
}))
} else {
YieldSplat::Enumerator(rb_self.enumeratorize("count_to_3_abc", ()))
}
}
define_global_function("count_to_3_abc", method!(count_to_3_abc, 0));
// call Ruby method with a block.
let a = RArray::new();
rb_assert!("count_to_3_abc {|i, c| a << [i, c]} == nil", a);
rb_assert!(r#"a == [[1, "a"], [2, "b"], [3, "c"]]"#, a);
// call Ruby method without a block.
let enumerator: Value = eval("count_to_3_abc").unwrap();
rb_assert!(r#"enumerator.next == [1, "a"]"#, enumerator);
rb_assert!(r#"enumerator.next == [2, "b"]"#, enumerator);
Variants§
Auto Trait Implementations§
impl<I> Freeze for YieldSplat<I>where
I: Freeze,
impl<I> RefUnwindSafe for YieldSplat<I>where
I: RefUnwindSafe,
impl<I> Send for YieldSplat<I>where
I: Send,
impl<I> Sync for YieldSplat<I>where
I: Sync,
impl<I> Unpin for YieldSplat<I>where
I: Unpin,
impl<I> UnwindSafe for YieldSplat<I>where
I: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more