P.FMT.11 导入模块分组应该具有良好的可读性

【描述】

  1. 导入同一模块的类型,应该置于同一个块内(imports_granularity="Crate")。
  2. 模块导入应该按以下规则进行分组(group_imports="StdExternalCrate"):
    • 导入来自 stdcorealloc的模块需要置于前面。
    • 导入来自 第三方库的模块 应该置于中间。
    • 导入来自本地 selfsupercrate前缀的模块,置于后面。
  3. 分组内使用字典序进行排序(reorder_imports=true)。

说明: 默认 rustfmt 不会对导入的模块自动分组,而是保留开发者的导入顺序。所以,这里需要修改 rustfmt 默认配置,才能让rustfmt应用此规则,但因为这几个配置项暂时未稳定,所以需要在 Nightly 下使用。

【反例】

例1:


#![allow(unused)]
fn main() {
// 不符合: 同一模块类型应该置于同一个块内
// 当 `imports_granularity="Preserve"`
use foo::b;
use foo::b::{f, g};
use foo::{a, c, d::e};
use qux::{h, i};
}

例2:


#![allow(unused)]
fn main() {
// 不符合:当按默认值设置时,模块导入比较乱,影响可读性
use super::update::convert_publish_payload;
use chrono::Utc;

use alloc::alloc::Layout;
use juniper::{FieldError, FieldResult};
use uuid::Uuid;

use std::sync::Arc;

use broker::database::PooledConnection;

use super::schema::{Context, Payload};
use crate::models::Event;
use core::f32;
}

【正例】

例1:


#![allow(unused)]
fn main() {
// 符合
// 当 `imports_granularity="Crate"`
use foo::{
    a, b,
    b::{f, g},
    c,
    d::e,
};
use qux::{h, i};
}

例2:


#![allow(unused)]
fn main() {
// 符合
// 当 `group_imports="StdExternalCrate` 且 `reorder_imports=true`
use alloc::alloc::Layout;
use core::f32;
use std::sync::Arc;

use broker::database::PooledConnection;
use chrono::Utc;
use juniper::{FieldError, FieldResult};
use uuid::Uuid;

use super::schema::{Context, Payload};
use super::update::convert_publish_payload;
use crate::models::Event;
}

【rustfmt 配置】

对应选项可选值是否 stable说明
imports_granularity(Preserve(默认),Crate(推荐))No默认保留开发者的模块导入顺序
reorder_importstrue(默认)No模块分组内根据模块首字母按字典序进行排序
group_imports(Preserve(默认), StdExternalCrate(建议))No默认保留开发者的模块导入分组