EG
Size: a a a
EG
Z
OA
OA
.collect::<Result<Vec<_>, _>>()Э
collect::<Option<T>>. Твой try_collect так не сможет без привязки к какому-нибудь Try трейту, а это анстейбл и куча ненужной работы.OA
r
trait TryCollectVec: Sized + Iterator {
fn try_collect<V, E>(self) -> Result<Vec<V>, E>
where Result<Vec<V>, E>: FromIterator<Self::Item>
{
self.collect()
}
}
impl<I: Iterator> TryCollectVec for I {}Э
trait TryCollectVec: Sized + Iterator {
fn try_collect<V, E>(self) -> Result<Vec<V>, E>
where Result<Vec<V>, E>: FromIterator<Self::Item>
{
self.collect()
}
}
impl<I: Iterator> TryCollectVec for I {}r
try_collect_vec() и try_collect() -> Result<Container, E>f
macro_rules! poll_loop {
($self:ident,$behaviour:expr,$cx:expr,$params:expr,$either:path) => {{
...
Poll::Ready(NetworkBehaviourAction::NotifyHandler { peer_id, event, handler, }) => {
return Poll::Ready(NetworkBehaviourAction::NotifyHandler {
peer_id,
event: $either(event),
handler,
})
}
...
}};
}
$either. Вот так всё работает:poll_loop!(self, self.plumber, cx, params, EitherOutput::First);
poll_loop!(self, self.dht, cx, params, EitherOutput::Second);
$either какой-то вид identity, т.е. "ничего". Чтобы в итоге event: $either(event) превратилось просто в event: event.poll_loop!(self, self.plumber, cx, params, ::);poll_loop!(self, self.plumber, cx, params, event => EitherOutput::First(EitherOutput::First(event)));Э
macro_rules! poll_loop {
($self:ident,$behaviour:expr,$cx:expr,$params:expr,$either:path) => {{
...
Poll::Ready(NetworkBehaviourAction::NotifyHandler { peer_id, event, handler, }) => {
return Poll::Ready(NetworkBehaviourAction::NotifyHandler {
peer_id,
event: $either(event),
handler,
})
}
...
}};
}
$either. Вот так всё работает:poll_loop!(self, self.plumber, cx, params, EitherOutput::First);
poll_loop!(self, self.dht, cx, params, EitherOutput::Second);
$either какой-то вид identity, т.е. "ничего". Чтобы в итоге event: $either(event) превратилось просто в event: event.poll_loop!(self, self.plumber, cx, params, ::);poll_loop!(self, self.plumber, cx, params, event => EitherOutput::First(EitherOutput::First(event)));macro_rules! poll_loop {
($self:ident, $behaviour:expr ,$cx:expr, $params:expr, ::) => {};
($self:ident, $behaviour:expr, $cx:expr, $params:expr, $either:path) => {};
}в🧇
macro_rules! poll_loop {
($self:ident,$behaviour:expr,$cx:expr,$params:expr,$either:path) => {{
...
Poll::Ready(NetworkBehaviourAction::NotifyHandler { peer_id, event, handler, }) => {
return Poll::Ready(NetworkBehaviourAction::NotifyHandler {
peer_id,
event: $either(event),
handler,
})
}
...
}};
}
$either. Вот так всё работает:poll_loop!(self, self.plumber, cx, params, EitherOutput::First);
poll_loop!(self, self.dht, cx, params, EitherOutput::Second);
$either какой-то вид identity, т.е. "ничего". Чтобы в итоге event: $either(event) превратилось просто в event: event.poll_loop!(self, self.plumber, cx, params, ::);poll_loop!(self, self.plumber, cx, params, event => EitherOutput::First(EitherOutput::First(event)));std::convert::identity?Э
$either:path можно передавать $into_event:expr. Туда просто пихать любые лямбды или функции, которые могут принимать event.f
macro_rules! poll_loop {
($self:ident, $behaviour:expr ,$cx:expr, $params:expr, ::) => {};
($self:ident, $behaviour:expr, $cx:expr, $params:expr, $either:path) => {};
}macro_rules! poll_loop {
($self:ident,$behaviour:expr,$cx:expr,$params:expr$(,$either:path)?) => {{
$(let event = $either(event);)?
...
}};
}Э
macro_rules! poll_loop {
($self:ident, $behaviour:expr, $cx:expr, $params:expr, $into_event:expr) => {{
...
Poll::Ready(NetworkBehaviourAction::NotifyHandler { peer_id, event, handler, }) => {
return Poll::Ready(NetworkBehaviourAction::NotifyHandler {
peer_id,
event: $into_event(event),
handler,
})
}
...
}};
}
poll_loop!(self, self.plumber, cx, params, EitherOutput::First);
poll_loop!(self, self.plumber, cx, params, std::convert::identity);
poll_loop!(self, self.plumber, cx, params, |event| event.into());Э
f
macro_rules! poll_loop {
($self:ident,$behaviour:expr,$cx:expr,$params:expr$(,$either:path)?) => {{
$(let event = $either(event);)?
...
}};
}into_event мне нравится больше, спасибо!m
#[derive(Debug)]
struct SegmentsStore {}
#[derive(Clone, Debug)]
struct SegmentsCache {
store: std::sync::Arc<parking_lot::RwLock<SegmentsStore>>
}
unsafe impl Send for SegmentsCache {}
unsafe impl Sync for SegmentsCache {}
impl SegmentsCache {
fn new() -> Self {
Self { store: std::sync::Arc::new(parking_lot::RwLock::new(SegmentsStore {})) }
}
fn add(&self) { unimplemented!() }
fn remove(&self) { unimplemented!() }
}
MB
Э
unsafe impl. Если Arc<RwLock<T>> их будет имплементить, они автоматом твоей структуре зайдут.