我有这样的事情:
#[macro_use]
extern crate quick_error;
#[cfg(target_os = "linux")]
#[macro_use]
extern crate nix;
quick_error! {
#[derive(Debug)]
pub enum Error {
DeviceNotFound{
description("Could not find a ledger device")
}
Ioctl ( err: nix::Error ) {
from()
description("ioctl error")
display("ioctl error: {}", err)
cause(err)
}
}
}
我的问题是nix
只能在linux中使用。
我怎样才能使Ioctl
成为linux的条件?或者这是一个坏主意?
我想知道Rust的推荐方法是什么。
另一种方法是:只要我不使用任何函数/方法,即使在Windows中也可以使用nix crate类型吗?在这种情况下,我不需要使这条件有条件。
更新:似乎from()
线与问题有关。
@Stargateur肯定适用于大多数情况,但不适用于我的具体问题。我在这里添加一个Example code。
#[macro_use]
extern crate quick_error;
quick_error! {
#[derive(Debug)]
pub enum Error {
DeviceNotFound{
description("Could not find a ledger device")
}
#[cfg(target_os = "windows")]
Ioctl ( err: nix::Error ) {
from()
description("ioctl error")
display("ioctl error: {}", err)
cause(err)
}
}
}
fn main() {
let _ = Error::DeviceNotFound;
}
所以在quickerror中使用条件编译是不可能的。经过一些实验,我想出了在不存在的平台上模拟类型的想法:
#[macro_use]
extern crate quick_error;
#[macro_use]
extern crate cfg_if;
cfg_if! {
if #[cfg(target_os = "linux")] {
extern crate nix;
} else {
// Mock the type in other target_os
mod nix {
quick_error! {
#[derive(Debug)]
pub enum Error {}
}
}
}
}
quick_error! {
#[derive(Debug)]
pub enum Error {
DeviceNotFound{
description("Could not find a ledger device")
}
Ioctl ( err: nix::Error ) {
from()
description("ioctl error")
display("ioctl error: {}", err)
cause(err)
}
}
}
如何让Ioctl成为linux的条件?
通常,你可以把#[cfg(target_os = "linux")]
放在前面:
#[cfg(target_os = "linux")]
Ioctl(err: nix::Error) {
from()
description("ioctl error")
display("ioctl error: {}", err)
cause(err)
}
但它看起来像quick_error
不支持它,所以你可以在github上打开一个请求功能,但是箱子不是非常活跃(没有冒犯)或者你可能只是不使用这个箱子并且“手动”执行你的错误类型。
我想知道Rust的推荐方法是什么。
这是基于意见的,随心所欲。
另一种方法是:只要我不使用任何函数/方法,即使在Windows中也可以使用nix crate类型吗?在这种情况下,我不需要使这条件有条件。
不,你不能使用不编译的箱子。