用不同大小的类型调用转化

时间:2017-09-14 11:29:23

标签: rust

我正在尝试使用cargo build构建一个Rust项目,但是我收到了这个错误:

error[E0512]: transmute called with types of different sizes
   |
90 |     ::std::mem::transmute(tenv)
   |     ^^^^^^^^^^^^^^^^^^^^^
   |
   = note: source type: i32 (32 bits)
   = note: target type: *mut traction::Environment<JNIPlatform<'a>, std::string::String> (64 bits)

破坏的代码是:

let tenv = env.get_field_unsafe(obj, JFieldID::from(field), jni::signature::JavaType::Primitive(jni::signature::Primitive::Int)).unwrap_alog().i().unwrap();
::std::mem::transmute(tenv)

我不知道Rust,所以我只能猜测它是做什么的。

由于这是一个类型转换问题,我假设这与我的操作系统有关。克隆同一个存储库的其他人没有这样的问题(在ma​​cOS和Windows上)。我有macOS Sierra 10.12.6。

另一个问题:transmute如何知道转换给它的变量的类型? ::std::mem::transmute(tenv)只接受一个参数,那么它如何知道源类型和目标类型?

1 个答案:

答案 0 :(得分:1)

目标类型是指针,因此它的体系结构特定:32位平台上的32位,64位平台上的64位。在这种情况下,可以使用usizeisize

如果它不是您的代码,则应在原始存储库中打开一个问题。

您可以尝试使用rustup default stable-i686

构建32位二进制文​​件
  

transmute如何知道转换给它的变量的类型? ::std::mem::transmute(tenv)只接受一个参数,那么它如何知道源类型和目标类型?

Rust以与Iterator::collect相同的方式从上下文中推断出源和目标类型。