< 返回版块

isatuo 发表于 2020-10-04 23:22

Tags:rust

作业里的一道题 实在是做不出来了 请教大家一下 希望各位大神能够帮帮忙 我查了一些资料 发现这个和nom::error::context非常相似 但是还是百思不得其解做不出来 大概只能想出来第一题的 return type 是 IResult

以下是一段Rust Statement

let (i, j) = my_function(bar)(i)?;

以下是my_function() 的函数签名:

pub fn my_function<I: Clone, O, E: ParseError<I>, F>(f: F) -> impl Fn(I) -> IResult<I, Option<O>, E> 
where
    F: Fn(I) -> IResult<I, O, E>

以下是 IResult 的定义

type IResult<I, O, E = (I, ErrorKind)> = Result<(I, O), Err<E>>;

回答以下问题

  1. my_function 的返回值是什么类型?

  2. bar 是什么类型?

  3. 以下表达的返回值是什么类型?

my_function(bar)(i)?
  1. j 是什么类型?

评论区

写评论
c5soft 2020-10-05 19:42

正解。IResult的定义很重要:type IResult<I, O, E = (I, ErrorKind)> = Result<(I, O), Err>

gwy15 2020-10-04 23:35
type IResult<I, O, E = (I, ErrorKind)> = Result<(I, O), Err<E>>;

pub fn my_function<I: Clone, O, E: ParseError<I>, F>(f: F) -> impl Fn(I) -> IResult<I, Option<O>, E> 
where
    F: Fn(I) -> IResult<I, O, E>

let (i, j) = my_function(bar)(i)?;

显然,my_function 返回的是一个 callable,实现了 Fn(I)->IResult<I,Option<O>,E> trait.

bar 这里是 my_function 的参数,所以是 F 类型,也就是一个 callable,实现了 Fn(I)->IResult<I,O,E> trait.

my_function(bar)(i)? 被 call 之后,返回的是 IResult<I,Option<O>,E>,try 之后是 Result 的 Ok 内容,也就是 (I,Option<O>) 类型,这里 Ii 的类型,O 的类型得看 bar 的签名。

j 也就是上面说的Option<O>

1 共 2 条评论, 1 页