< 返回版块

w 发表于 2021-05-08 14:22

我在用rust编写一个类库。这个类库有一些结构体或函数是处于测试阶段的,因此我想增加一个#[beta]宏来标注这些方法。有没有什么方法使其他人在调用标注这个宏的结构体/函数时,编译期会发出类似warning: associated function is beta.waning

评论区

写评论
作者 w 2021-05-09 14:47

这个rfc确实满足我的需求,感谢老哥,我去研究研究

--
👇
modraedlau: 在nightly的版本下其实可以使用unstable

lib.rs

#![feature(staged_api)]

#![unstable(feature = "beta", issue = "27731", reason = "associated function is beta")]
pub fn hello() -> &'static str {
    "Hello, world!"
}

main.rs

// #![feature(beta)]

use unstable_test::hello;

fn main() {
    println!("{}", hello());
}

不过这样如果引用及使用unstable的方法时会编译时出现error,如果要消除error,把// #![feature(beta)]的注释代码打开,但是这样完全可以通过编译也没有warning。

如果想要完全自己实现一个#[beta],可以自定义一个lint到rustc0089-loadable-lints

modraedlau 2021-05-09 12:59

在nightly的版本下其实可以使用unstable

lib.rs

#![feature(staged_api)]

#![unstable(feature = "beta", issue = "27731", reason = "associated function is beta")]
pub fn hello() -> &'static str {
    "Hello, world!"
}

main.rs

// #![feature(beta)]

use unstable_test::hello;

fn main() {
    println!("{}", hello());
}

不过这样如果引用及使用unstable的方法时会编译时出现error,如果要消除error,把// #![feature(beta)]的注释代码打开,但是这样完全可以通过编译也没有warning。

如果想要完全自己实现一个#[beta],可以自定义一个lint到rustc0089-loadable-lints

作者 w 2021-05-09 12:30

感谢老哥,我去看看

--
👇
Neutron3529: 总觉得可以借助deprecated

如果你真想做一个beta,可能需要仔细研究源代码中deprecated是如何实现的……

这篇文章或许对你有所帮助

$ rc test.rs 
rustc test.rs -C opt-level=3 -C target-cpu=native -C codegen-units=1 -C lto -o test  && ./test
warning: use of deprecated function `test`: This function is in Beta, which may not very stable.
 --> test.rs:6:5
  |
6 |     test();
  |     ^^^^
  |
  = note: `#[warn(deprecated)]` on by default

warning: 1 warning emitted

BetaOk
$ cat test.rs 
#[deprecated="This function is in Beta, which may not very stable."]
fn test(){
    print!("Beta");
}
fn main(){
    test();
    println!("Ok");
}
Neutron3529 2021-05-08 18:38

总觉得可以借助deprecated

如果你真想做一个beta,可能需要仔细研究源代码中deprecated是如何实现的……

这篇文章或许对你有所帮助

$ rc test.rs 
rustc test.rs -C opt-level=3 -C target-cpu=native -C codegen-units=1 -C lto -o test  && ./test
warning: use of deprecated function `test`: This function is in Beta, which may not very stable.
 --> test.rs:6:5
  |
6 |     test();
  |     ^^^^
  |
  = note: `#[warn(deprecated)]` on by default

warning: 1 warning emitted

BetaOk
$ cat test.rs 
#[deprecated="This function is in Beta, which may not very stable."]
fn test(){
    print!("Beta");
}
fn main(){
    test();
    println!("Ok");
}
作者 w 2021-05-08 18:01

想在编译器就弹出警告,不是运行期。搜了下没有build_warning!这种宏。

--
👇
shaitao: 过程宏不是可以做到, 你在里面放println!

shaitao 2021-05-08 17:41

过程宏不是可以做到, 你在里面放println!

作者 w 2021-05-08 17:19

这样的话可能就破坏了预期的层级结构,并且粒度过大了:(

--
👇
gwy15: 加一个 unstable 的 feature,把对应的接口放到这个 feature 下

gwy15 2021-05-08 16:25

加一个 unstable 的 feature,把对应的接口放到这个 feature 下

1 共 8 条评论, 1 页