我正在尝试通过核心图形包在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_rule
的pub trait TCFType
from core-foundation从CGContext
构建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,所以我被困在这里。为什么这不起作用,我怎样才能使它发挥作用?修改核心图形是一种选择,因为无论如何我将不得不在以后的路上进行。
答案 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。这样做会导致此错误消失,但之后会出现一些以前隐藏的无关错误。