使用核心图形时,没有为类型CGContext找到名为wrap_under_create_rule的关联项

时间:2017-06-05 00:02:37

标签: rust

我正在尝试通过核心图形包在Mac应用程序中使用Rust的Quartz2D,但我在使用核心图形时遇到了麻烦。我可以通过以下方式获取当前上下文的CGContextRef

let cg_context_ref: CGContextRef = unsafe {
    let ns_graphics_context: *mut Object = msg_send![Class::get("NSGraphicsContext").unwrap(), currentContext];
    msg_send![ns_graphics_context, CGContext]
}

然后,我尝试使用来自wrap_under_create_rulepub trait TCFType from core-foundationCGContext构建CGContextRef

let gc: CGContext = unsafe {
    CGContext::wrap_under_create_rule(unsafe {
        let ns_graphics_context: *mut Object = msg_send![Class::get("NSGraphicsContext").unwrap(), currentContext];
        msg_send![ns_graphics_context, CGContext]
    })
};

但是,编译会出现此错误:

error: no associated item named `wrap_under_create_rule` found for type `core_graphics::context::CGContext` in the current scope
  --> src/lib.rs:45:9
   |
45 |         CGContext::wrap_under_create_rule(unsafe {
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: items from traits can only be used if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it:
   = help: candidate #1: `use core_foundation::base::TCFType;`

我已经拥有use core_foundation::base::TCFType;,但在同一范围内。它看起来像这样:

#[macro_use]
extern crate objc;
extern crate core_foundation;
extern crate core_graphics;

use objc::runtime::{Object, Class};
use core_foundation::base::TCFType;
use core_graphics::context::CGContext;

fn main() {
    let gc: CGContext = unsafe {
        CGContext::wrap_under_create_rule(unsafe {
            let ns_graphics_context: *mut Object = msg_send![Class::get("NSGraphicsContext").unwrap(), currentContext];
            msg_send![ns_graphics_context, CGContext]
        })
    };
}

我有点像Rust noob,所以我被困在这里。为什么这不起作用,我怎样才能使它发挥作用?修改核心图形是一种选择,因为无论如何我将不得不在以后的路上进行。

1 个答案:

答案 0 :(得分:0)

您正在处理两个不同版本的TCFType,这很有可能。按照你的例子,我看到了同样的错误。然后我跑了cargo-tree

$ cargo tree
cg v0.1.0 (file:///private/tmp/cg)
├── core-foundation v0.4.0               <---- here
│   ├── core-foundation-sys v0.4.0
│   │   └── libc v0.2.23
│   └── libc v0.2.23 (*)
├── core-graphics v0.8.1
│   ├── bitflags v0.8.2
│   ├── core-foundation v0.3.0           <---- here
│   │   ├── core-foundation-sys v0.3.1
│   │   │   └── libc v0.2.23 (*)
│   │   └── libc v0.2.23 (*)
│   └── libc v0.2.23 (*)
└── objc v0.2.2
    └── malloc_buf v0.0.6
        └── libc v0.2.23 (*)

由此可以看出,核心图形依赖于核心基础0.3.0,但你的箱子依赖于核心基础0.4.0。

两种不同版本的crates 提供的类型不一样,编译器会告诉您。它只是没有告诉你版本不同。

要解决此问题,请将您的core-foundation版本限制为0.3.0。这样做会导致此错误消失,但之后会出现一些以前隐藏的无关错误。