Если ваши data.frames приведены в примере, который вы могли бы сделать:
dfC <- dfA
dfC[-1] <- as.integer(dfB[-1] > dfA[-1])
dfC
index B C
1 1 1 0
2 2 1 1
3 3 1 0
4 4 0 1
5 5 0 0
[-1]
на data.frame
выбирает весь файл данных, кроме первого столбца.
Ни async
функций, ни impl Trait
не допускаются в чертах. Вы можете использовать связанные типы, чтобы стать ближе. Вот некоторые идеи:
pub trait ResourceTrait {
type FutType: Future<Output = ()>;
fn prepare(&mut self, auth: &str) -> Self::Next;
}
Реализация этого в настоящее время немного сложна, так как некоторые из необходимых инструментов либо еще не доступны, либо стабильны, либо содержат ошибки.
Это может быть реализовано как:
impl ResourceTrait for Resource {
type FutType = FutureObj<'static, ()>;
fn prepare(&mut self, auth: &str) -> FutureObj<'static, ()> {
FutureObj::new(Box::new(
async move {
// Do async things
// You might get a lifetime issue here if trying to access auth,
// since it's borrowed.
}
))
}
}
Альтернативой с экзистенциальными типами может быть:
impl ResourceTrait for Resource {
// this is required since the real type of the async function
// is unnameable
existential type FutType = Future<Output = ()>;
fn prepare(&mut self, auth: &str) -> Self::FutType {
async move {
// Do async things. Might still encounter the same borrowing issues,
// since the lifetime of the returned Future isn't coupled to the
// lifetime of self.
// The workaround is to make copies of all required fields and move
// them into the Future
}
}
}
Это может работать или не работать (так как функция находится в процессе разработки) , Для правильного заимствования таких параметров, как self
или auth
в возвращаемом будущем, нам также может потребоваться, чтобы вначале были доступны общие ассоциированные типы.
Чтобы обойти проблемы заимствования для self
, вы можете определить
struct Resource {
inner: Arc<ResourceInner>, // carries all actual state
}
, чтобы скопировать inner
в prepare
и переместить его в Future
.