una recta pollera pinzas para moderna hacer faldas falda coser con como colocar cintura agrandar achicar rust rust-0.9

rust - recta - pinzas para faldas



Clonar una estructura que almacena un cierre (0)

Actualmente estoy intentando implementar una biblioteca simple de Parser-Combinator en Rust. Para eso me gustaría tener una función de map genérico para transformar el resultado de un analizador.

El problema es que no sé cómo copiar una estructura que contiene un cierre. Un ejemplo es la estructura del Map en el siguiente ejemplo. Tiene un campo mapFunction almacena una función, que recibe el resultado del analizador anterior y devuelve un nuevo resultado. Map es en sí mismo un analizador sintáctico que se puede combinar con otros analizadores.

Sin embargo, para que los analizadores sintácticos se combinen, necesitaría que se puedan copiar (teniendo el rasgo de Clone ), pero ¿cómo proporciono esto para el Map ?

Ejemplo: (Solo el pseudocódigo, probablemente no se compile)

trait Parser<A> { // Cannot have the ": Clone" bound because of `Map`. // Every parser needs to have a `run` function that takes the input as argument // and optionally produces a result and the remaining input. fn run(&self, input: ~str) -> Option<(A, ~str)> } struct Char { chr: char } impl Parser<char> for Char { // The char parser returns Some(char) if the first fn run(&self, input: ~str) -> Option<(char, ~str)> { if input.len() > 0 && input[0] == self.chr { Some((self.chr, input.slice(1, input.len()))) } else { None } } } struct Map<''a, A, B, PA> { parser: PA, mapFunction: ''a |result: A| -> B, } impl<''a, A, B, PA: Parser<A>> Parser<B> for Map<''a, A, B, PA> { fn run(&self, input: ~str) -> Option<(B, ~str)> { ... } } fn main() { let parser = Char{ chr: ''a'' }; let result = parser.run(~"abc"); // let mapParser = parser.map(|c: char| atoi(c)); assert!(result == Some(''a'')); }