Ich erstelle eine Methode zum Formatieren von Daten aus einem Iterator. Damit Chaining, ich versuche, es als neue Methode der Iterator durch Generika zu bieten:Implementieren Sie die Eigenschaft für alle Iterator
trait ToSeparatedString {
fn to_separated_string(self, line_prefix: &str, separator: &str) -> String;
}
impl<T, I> ToSeparatedString for I
where
T: Display,
I: Iterator<Item = T> + Clone,
{
fn to_separated_string(self, line_prefix: &str, separator: &str) -> String {
let len = self.clone().count();
self.enumerate()
.map(|(i, line)| if i < len - 1 {
(line, separator)
} else {
(line, "")
})
.fold::<String, _>("".to_owned(), |acc, (line, line_end)| {
format!("{}{}{}{}", acc, line_prefix, line, line_end)
})
}
}
Dann ist es ich verwende hier:
#[derive(Debug)]
pub struct TransactionDocumentBuilder<'a> {
/// Currency Id.
pub currency: &'a str,
/// Document timestamp.
pub blockstamp: Blockstamp,
/// Transaction locktime (in seconds ?)
pub locktime: u64,
/// List of issuers.
pub issuers: Vec<ed25519::PublicKey>,
/// List of inputs.
pub inputs: Vec<Input>,
/// List of outputs.
pub outputs: Vec<Output>,
/// Transaction comment.
pub comment: &'a str,
}
impl<'a> DocumentBuilder<TransactionDocument> for TransactionDocumentBuilder<'a> {
fn build_with_signature(self, signature: ed25519::Signature) -> TransactionDocument {
TransactionDocument {
document: GenericDocumentBuilder::new(10, "Transaction", self.currency)
.with("Blockstamp", &self.blockstamp.to_string())
.with("Locktime", &self.locktime.to_string())
.with("Issuers", &self.issuers.iter().to_separated_string("", "\n"))
.with("Inputs", &self.inputs.iter()
.map(|input| input.source)
.to_separated_string("", " "))
// Iterate through each input unlocks
.with("Unlocks", &self.inputs.iter()
.enumerate()
.map(|(i, input)| {
input.unlocks.iter().to_separated_string(&i.to_string(), "\n")
})
.to_separated_string("", "\n")
)
// more fields
.build_with_signature(signature),
};
unimplemented!()
}
fn build_and_sign(self, _private_key: &ed25519::PrivateKey) -> TransactionDocument {
unimplemented!()
}
}
Es ist funktioniert, wenn ich verwende es nach ein .iter()
, aber nicht nach einem .map()
, und sagt, es ist nicht implementiert. Aber std::slice::Iter
und std::iter::Map
implementiert Iterator<Item = T> + Clone
, also wo ist das Problem?
Vielen Dank im Voraus für Sie Hilfe.
Posting Umschreiben entfernen, um ein [Minimal, vollständig und prüfbare Beispiel (MCVE)] (https: // Stackoverflow. com/help/mcve), die Ihr Problem zeigt, würde Ihnen helfen, bessere Antworten zu erhalten. – red75prime
Ich wusste es nicht. Ich werde es für zukünftige Fragen behalten. – Nanocryk