2014-12-17 2 views
1

부모 구조체에 래핑 된 일부 데이터를 보내기 위해 제네릭 함수를 작성하려고합니다. 그런 다음 데이터를 JSON으로 인코딩하고 소켓과 함께 보내야합니다.제네릭 형식을 인코딩 할 때 수명 매개 변수의 개수가 잘못되었습니다.

extern crate serialize; 
use serialize::json; 
use serialize::serialize::{Encodable, Encoder}; 
use std::io::{TcpStream, IoResult}; 

#[deriving(Decodable, Encodable)] 
struct RemoteRequest<T> { 
    id: String, 
    auth: RequestAuth, 
    data: T, 
} 

fn send_request<'a, T:Encodable<Encoder<'a>>>(mut socket: TcpStream, id: &str, data: &'a T) -> IoResult<()> { 
    let encoded = json::encode(&RemoteRequest { 
     id: id.to_string(), 
     auth: RequestAuth { 
      id: "ForgeDevName".to_string(), 
      pass: "password".to_string(), 
     }, 
     data: data, 
    }); 
    return socket.write((encoded + "\n\n\n").as_bytes()) 
} 

하지만 다음과 같은 컴파일러 오류 받고 있어요 : 아무리 내가 뭘

error: wrong number of lifetime parameters: expected 0, found 1 [E0107] 
fn send_request<'a, T:Encodable<Encoder<'a>>>(mut socket: TcpStream, id: &str, data: &'a T) -> IoResult<()> { 
           ^~~~~~~~~~~ 

을, 나는 나를 넘어 무엇 <T>

+0

'인코더 <'a>'대신 '인코더'로 시도한 결과는 무엇입니까? – Shepmaster

+0

형식 인수의 수가 잘못되었습니다. 예상 1, 찾음 0 ----- fn send_request > (mut 소켓 : TcpStream, ID : & str, 데이터 : & T) -> std :: io :: IoResult <()> – olee

답변

1

에 대한 올바른 일반적인 매개 변수를 찾을 수 없습니다 이것을 컴파일하기 위해 많이 시도하는 것은 json::Encoderserialize::Encoder 사이의 구분입니다. 그 오류 메시지는 출력에서 ​​손실되었고, 기존의 Encoder 임포트는 옳은 것이 사용 된 것처럼 보였습니다.

일부 가져 오기가 컴파일되도록 변경되었습니다.

extern crate serialize; 
use serialize::json; 
use serialize::{Encodable, Encoder}; 
use std::io::{TcpStream, IoResult}; 
use std::io::IoError; 

#[deriving(Decodable, Encodable)] 
struct RequestAuth { 
    id: String, 
    pass: String, 
} 

#[deriving(Decodable, Encodable)] 
struct RemoteRequest<T> { 
    id: String, 
    auth: RequestAuth, 
    data: T, 
} 

fn send_request<'a, T>(mut socket: TcpStream, id: &str, data: &T) -> IoResult<()> 
    where T: Encodable<serialize::json::Encoder<'a>, IoError> 
{ 
    let a = RemoteRequest { 
     id: id.to_string(), 
     auth: RequestAuth { 
      id: "ForgeDevName".to_string(), 
      pass: "password".to_string(), 
     }, 
     data: data, 
    }; 

    let encoded = json::encode(&a); 

    socket.write((encoded + "\n\n\n").as_bytes()) 
} 
관련 문제