2014-05-25 2 views
2

방금 ​​Rust가 클로저를 처리하는 방법에 문제가 발생했습니다.왜 Rust의 클로저와 함수의 강력한 차이점과 그 해결 방법은 무엇입니까?

는,의 내가 도서관 저자있어이 방법은 사용자가이 녹 때문에 작동하지 않습니다이

let foo = "str"; 
server.get(|| -> &str { foo }); 

같은이 메소드를 호출하고 싶어 이제 경우

fn get(&mut self, handler: fn() -> &str){ 
    //do something with handler 
} 

를 작성한 가정하자 according to it's documentation은 일반 함수와 클로저 사이에 큰 차이가 있습니다.

라이브러리 작성자는 라이브러리 사용자가을 너무 많이 사용하지 않도록하기 위해 항상 이러한 메소드를 일반 함수 대신 닫음을 허용해야합니다.

또한 폐쇄가 유일한 방법으로 작성된 것처럼 보입니다 익명의 함수 또는 실수입니까?

답변

4

현재 fn() 유형은 || 유형으로 자동 "승격"될 수 있습니다. (빈 환경 클로저, 나는 가정한다.) 예를 들어,이 작품 :

fn get(handler: || -> &str) -> &str { 
    handler() 
} 

fn main() { 
    fn handler_fn() -> &str { "handler_fn" } 
    let handler_cl = || -> &str "handler_cl"; 
    println!("{}", get(handler_fn)); 
    println!("{}", get(handler_cl)); 
} 

그래서 라이브러리 기능 gethandler가 폐쇄인지 여부를 상관하지 않는 경우, 그냥 받아들이는 합리적인 것 같다 최대한의 유연성을위한 클로저. 그러나 이것이 항상 가능하지는 않습니다. 예를 들어 다른 작업에서 handler을 실행하려면 fn 또는 proc 유형이어야합니다. (여기서 100 % 확실하지는 않습니다. 세부 사항이 누락되었을 수 있습니다.)

익명 함수와 관련해서는 || 또는 proc 클로저가 익명 함수를 작성하는 유일한 두 가지 방법입니다.

+0

좋아요, 폐쇄가 실제로 그 길로가는 것 같습니다. 그러나, 그것은 저를위한 pandoras 상자를 열었다. 내 다음 질문을 살펴보고 싶을 수도 있습니다 .-) http://stackoverflow.com/questions/23859866/how-to-specify-lifetime-for-optionclosure-in-rust – Christoph

관련 문제