返回通用结构的函数的签名是什么?



我正在通过syslog板条箱,从我的功能中,我想返回一个我认为是通用struct syslog::Logger的logger对象。以下大部分均取自板条箱文档,除了返回部分和unwrap((。

extern crate syslog;
use syslog::{Facility, Error, Formatter3164};
pub fn get_logger() -> syslog::Logger{
    let formatter = Formatter3164 {
        facility: Facility::LOG_USER,
        hostname: None,
        process: "myprogram".into(),
        pid: 0,
    };
    syslog::unix(formatter).unwrap()
}

但是我看到

pub fn get_logger() -> syslog::Logger{
                       ^^^^^^^^^^^^^^ expected 3 type arguments

syslog::Logger结构的签名是

pub struct Logger<Backend: Write, T, Formatter: LogFormat<T>>

syslog::unix的签名是

pub fn unix<U: Display, F: Clone+LogFormat<U>>(formatter: F) -> Result<Logger<LoggerBackend, U, F>> {

其中Displaystd::fmt::DisplayLogFormatsyslog板条箱中定义的具有以下定义的特征。

pub trait LogFormat<T> {
  fn format<W: Write>(&self, w: &mut W, severity: Severity, message: T)   -> Result<()>;
  fn emerg<W: Write>(&mut self, w: &mut W, message: T)   -> Result<()> {
    self.format(w, Severity::LOG_EMERG, message)
  }
  fn alert<W: Write>(&mut self, w: &mut W, message: T)   -> Result<()> {
    self.format(w, Severity::LOG_ALERT, message)
  }
  fn crit<W: Write>(&mut self, w: &mut W, message: T)    -> Result<()> {
    self.format(w, Severity::LOG_CRIT, message)
  }
  fn err<W: Write>(&mut self, w: &mut W, message: T)     -> Result<()> {
    self.format(w, Severity::LOG_ERR, message)
  }
  fn warning<W: Write>(&mut self, w: &mut W, message: T) -> Result<()> {
    self.format(w, Severity::LOG_WARNING, message)
  }
  fn notice<W: Write>(&mut self, w: &mut W, message: T)  -> Result<()> {
    self.format(w, Severity::LOG_NOTICE, message)
  }
  fn info<W: Write>(&mut self, w: &mut W, message: T)    -> Result<()> {
    self.format(w, Severity::LOG_INFO, message)
  }
  fn debug<W: Write>(&mut self, w: &mut W, message: T)   -> Result<()> {
    self.format(w, Severity::LOG_DEBUG, message)
  }
}

这是一个通用结构,那么,如果我想从函数返回logger对象,该类型的签名是什么?

这里唯一的可选参数是 T。这是您登录时想要的消息类型。例如。在下面的示例中,日志消息类型是&str

let mut logger = get_logger();
logger.info("This is a log message");

您可以选择get_logger内部的类型,并将其放置在签名中,也可以制作get_logger通用,并使呼叫站点决定。第一种方法看起来像:

extern crate syslog;
use syslog::{Facility, Error, Formatter3164, LoggerBackend};
fn get_logger<'a>() -> syslog::Logger<LoggerBackend, &'a str, Formatter3164>{
    let formatter = Formatter3164 {
        facility: Facility::LOG_USER,
        hostname: None,
        process: "myprogram".into(),
        pid: 0,
    };
    syslog::unix(formatter).unwrap()
}
pub fn main(){
  let mut logger = get_logger();
  logger.info("This is a log message");
}

,通用方法看起来像这样。

extern crate syslog;
use syslog::{Facility, Error, Formatter3164, LoggerBackend};
pub fn get_logger<T: std::fmt::Display>() -> syslog::Logger<LoggerBackend, T, Formatter3164>{
    let formatter = Formatter3164 {
        facility: Facility::LOG_USER,
        hostname: None,
        process: "myprogram".into(),
        pid: 0,
    };
    syslog::unix(formatter).unwrap()
}
pub fn main(){
  let mut logger = get_logger();
  logger.info("This is a log message");
}

最新更新