#iota #plugin #macro #golang

nightly iota-rs

为怀念const块和iota的其他Go程序员提供的一个Rust宏

3个版本

使用旧版Rust 2015

0.1.2 2016年12月15日
0.1.1 2015年11月15日
0.1.0 2015年11月15日

1819Rust模式

MIT 许可证

12KB
227

iota-rs

iota-rs是一个为怀念const块和iota的其他Go程序员提供的Rust宏。

Go

const (
	Sunday = iota
	Monday
	Tuesday
	Wednesday
	Thursday
	Friday
	Partyday
	numberOfDays  // this constant is not exported
)

Rust

#![feature(plugin)]
#![plugin(iota)]

consts!{
	pub SUNDAY: i32 = iota!();
	pub MONDAY;
	pub TUESDAY;
	pub WEDNESDAY;
	pub THURSDAY;
	pub FRIDAY;
	pub PARTYDAY;
	NUMBER_OF_DAYS;  // this constant is not exported
}

类似于Go,你可以在一行中定义多个常量,并使用下划线跳过值。

Go

const (
	bit0, mask0 = 1 << iota, 1<<iota - 1  // bit0 == 1, mask0 == 0
	bit1, mask1                           // bit1 == 2, mask1 == 1
	_, _                                  // skips iota == 2
	Bit3, Mask3                           // bit3 == 8, mask3 == 7
)

Rust

#![feature(plugin)]
#![plugin(iota)]

consts!{
	(BIT0, MASK0): (i32, i32) = (1 << iota!(), 1<<iota!() - 1);  // bit0 == 1, mask0 == 0
	(BIT1, MASK1);                                               // bit1 == 2, mask1 == 1
	(_, _);                                                      // skips iota == 2
	(pub BIT3, pub MASK3);                                       // bit3 == 8, mask3 == 7
}

Rust无插件

// bit0 == 1, mask0 == 0
const BIT0: i32 = 1 << 0;
const MASK0: i32 = 1<<0 - 1;

// bit1 == 2, mask1 == 1
const BIT1: i32 = 1 << 1;
const MASK1: i32 = 1<<1 - 1;

// bit3 == 8, mask3 == 7
pub const BIT3: i32 = 1 << 3;
pub const MASK3: i32 = 1<<1 - 3;

正如你所看到的,与基础语言相比,此插件使得创建大量类似数值常量变得容易,无需大量错误易发的复制粘贴或需要定义自己的短期使用宏。

对于从Go过来的程序员,你可能已经注意到了一些差异

  • Rust更喜欢全部大写的常量,并且不基于大写字母来确定可见性,因此导出的常量必须标记为"pub"。
  • Rust常量必须显式地指定类型。
  • iota不是一个保留关键字,而是一个宏调用。
  • Rust的多个赋值使用更类似元组的结构。

无运行时依赖