代码之家  ›  专栏  ›  技术社区  ›  Onorio Catenacci

为什么这个模块不可见?

  •  0
  • Onorio Catenacci  · 技术社区  · 5 年前

    我在用铁锈写一个散列码练习。代码如下所示:

    pub fn get_fnv1a32(to_hash:&str) -> u32{
       const OFFSET_BASIS:u32 = 2_166_136_261;
       const PRIME:u32 = 16_777_619;
    
       if !to_hash.is_empty(){
          let mut hash = OFFSET_BASIS;
          for b in to_hash.bytes(){
             hash = hash ^ (b as u32);
             hash = hash.wrapping_mul(PRIME);
          }
          hash
       }
       else
       {
          0
       }
    }
    

    mod fnv;
    #[cfg(test)]
    mod tests {
        #[test]
        fn get_correct_hash(){
            assert_eq!(0x7a78f512, fnv::get_fnv1a32("Hello world!"));
        } 
    
        #[test]
        fn hash_handles_empty_string_correctly(){
            assert_eq!(0, fnv::get_fnv1a32(""));
        }
     } 
    

    测试代码在lib.rs中,并且 get_fnv1a32 函数在fnv.rs中。它们都在同一目录中。但当我试着运行货物测试时,我不断收到以下信息:

    Compiling hashes v0.1.0 (U:\skunkworks\rust\hashes)
    warning: function is never used: `get_fnv1a32`
     --> src\fnv.rs:1:8
      |
    1 | pub fn get_fnv1a32(to_hash:&str) -> u32{
      |        ^^^^^^^^^^^
      |
      = note: `#[warn(dead_code)]` on by default
    
    error[E0433]: failed to resolve: use of undeclared type or module `fnv`
     --> src\lib.rs:7:32
      |
    7 |         assert_eq!(0x7a78f512, fnv::get_fnv1a32("Hello world!"));
      |                                ^^^ use of undeclared type or module `fnv`
    
    error[E0433]: failed to resolve: use of undeclared type or module `fnv`
      --> src\lib.rs:12:23
       |
    12 |         assert_eq!(0, fnv::get_fnv1a32(""));
       |                       ^^^ use of undeclared type or module `fnv`
    
    error: aborting due to 2 previous errors
    

    我想不出我做错了什么。我试着改变 mod fnv; 从顶部到 pub mod fnv; 这样可以消除死代码警告,但不能修复这两个错误。我需要做什么才能得到 获取fnv1a32 函数在lib.rs文件中可见?

    我认为这并不重要,但是rustc的版本是 鲁斯特C 1.41.0(5e1a79984 2020-01-27)

    1 回复  |  直到 5 年前
        1
  •  1
  •   nnnmmm kennytm    5 年前

    测试模块与外部模块分开。添加

    use super::*;
    

    或类似的陈述 use crate::fnv tests 使 fnv 模块可见。