>

Rust가 오랫동안 C # 프로그래머로 일하면서 재미있게 놀았지만, 리플렉션에 대한 질문이 있습니다. 어쩌면 나는이 경우에 반성을 필요로하지 않지만 Rust가 강력하게 입력되었다고 생각하면 내가 할 것으로 의심됩니다 (나는 확실히 좋은 C #에서 필요합니다,면 양말을 축복하십시오).

이 상황이 있습니다 :

use std::collections::HashMap;
fn invoke_an_unknown_function(
    hashmap: HashMap<String, String>,
    // Something to denote a function I know nothing about goes here
) {
    // For each key in the hash map, assign the value
    // to the parameter argument whose name is the key
    // and then invoke the function
}

어떻게할까요? 나는 어떤 종류의 MethodInfo 를 통과해야한다고 생각합니다.  함수에 대한 두 번째 인수로 사용하여 해시 맵에서 키가 이름 인 인수를 가져 와서 값을 할당하지만 리플렉션 API를 살펴보고 다음과 같은 Rus 1.0 이전의 문서를 찾았습니다.

  • 모듈 std::reflect
  • 모듈 std::repr
  • [rust-dev] 리플렉션 시스템

이 중 어느 것도 시작하기에 충분하지 않습니다. 위에서 설명한 기능을 어떻게 구현합니까?

  • 답변 # 1

    트레이 트는 다른 곳에서 사용되는 반사의 상당량을 구현할 것으로 예상되는 방법입니다.

    trait SomeInterface {
        fn exposed1(&self, a: &str) -> bool;
        fn exposed2(&self, b: i32) -> i32;
    }
    struct Implementation1 {
        value: i32,
        has_foo: bool,
    }
    impl SomeInterface for Implementation1 {
        fn exposed1(&self, _a: &str) -> bool {
            self.has_foo
        }
        fn exposed2(&self, b: i32) -> i32 {
            self.value * b
        }
    }
    fn test_interface(obj: &dyn SomeInterface) {
        println!("{}", obj.exposed2(3));
    }
    fn main() {
        let impl1 = Implementation1 {
            value: 1,
            has_foo: false,
        };
        test_interface(&impl1);
    }
    
    

관련 자료

  • 이전 Proguard 후 Android 애플리케이션 충돌
  • 다음 unity3d - Unity의 iOS에 대한 Google Firebase 빌드 오류