2016-12-17 1 views
0

다음을 달성하기위한보다 간결한 방법이 있습니까?간결한 방법 상자 옵션에

fn boxed_option<T>(thing: Option<T>) -> Option<Box<T>> { 
    match thing { 
     Some(x) => Some(Box::new(x)), 
     None => None, 
    } 
} 

답변

6

Yes (예) :

thing.map(Box::new) 

난 강력하게 그들이 그렇게 pervasively 녹에 사용되는로 Iterator, OptionResult에있는 모든 방법을 암기 추천 할 것입니다. OptionResult에는 25 개 미만의 고유 한 메소드가 있으며, 그 중 많은 메소드가 두 유형 사이에 실질적인 중복을 가지고 있습니다. 적어도 모든 것을 읽고 사용 가능한 내용을 파악하고 암기하십시오. 항상 정확한 이름을 찾으려면 설명서를 다시 열 수 있습니다.


사실은 꽤이 작업을 얻을 수 없습니다.

fn function_2<F>(foo: Option<F>) 
    where F: 'static + FnMut() 
{ 
    let tmp: Option<Box<FnMut()>> = foo.map(Box::new); 
} 
error[E0308]: mismatched types 
    --> src/main.rs:14:37 
    | 
14 |  let tmp: Option<Box<FnMut()>> = foo.map(Box::new); 
    |          ^^^^^^^^^^^^^^^^^ expected trait std::ops::FnMut, found type parameter 
    | 
    = note: expected type `std::option::Option<Box<std::ops::FnMut()>>` 
    = note: found type `std::option::Option<Box<F>>` 

여기서 원래의 코드는 또 다른 하나 개의 형태를 변형 wan't, 그것도 형질 개체를 생성 하였다.

foo.map(|f| Box::new(f)); 

그러나 대신 말할 수 : 형질의 개체를 만드는의 형태가 암시 적으로 허용이되지 않는 이유 내가 확실히 말할 수

foo.map(|f| Box::new(f) as Box<FnMut()>); 

(그리고 필요 없음 물론 변수에 대한 유형을 지정하는 것). Box<Option<T>> 될 것이다 "는이 Option 권투"


Pedantically.

+0

"* 모든 방법 *"은 꽤 많이 있습니다. 아마도 map_err(), map_err() 및 and_then()과 같이 시작할 것입니다. 'Iterator','Option'과'Result'와는 다른 많은 다른 타입들도 있습니다. 그러나 나는 동의한다. 대부분의 방법에 익숙해지는 것이 중요하다. –

+0

사실 이걸 제대로 작동시키지 못합니다. [this code] (https://play.rust-lang.org/?gist=0c2b17c5bc7c0a8507d3f60cd2043357&version=stable&backtrace=0)를 참조하십시오. [이 관련 질문] (https://stackoverflow.com/questions/29879372/expected-trait-coreopsfnmut-found-type-parameter)을 찾았지만 여전히 문제가 해결되지 않았습니다./noob – Timmmm

+0

(내가 링크 한 코드는'map'을 사용하지 않지만 실제 코드에서'match'를'map'으로 대체 할 때와 같은 문제를 나타냅니다.) – Timmmm

관련 문제