【问题标题】:clippy::missing_const_for_fn fires on constructor and getters. Is that a true positive?clippy::missing_const_for_fn 在构造函数和 getter 上触发。这是真正的积极因素吗?
【发布时间】:2021-02-25 10:05:59
【问题描述】:

我决定使用更强大的 clippy 版本来为版本更改做好准备。我期待一些误报,但我不确定这个。我得到了以下结构,clippy 告诉我每个函数都应该是 const。 (clippy::missing_const_for_fn)

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ScheduleFields {
    years: Years,
    days_of_week: DaysOfWeek,
    months: Months,
    days_of_month: DaysOfMonth,
    hours: Hours,
    minutes: Minutes,
    seconds: Seconds,
}

impl ScheduleFields {
    // Constructor
    pub fn new(
        seconds: Seconds,
        minutes: Minutes,
        hours: Hours,
        days_of_month: DaysOfMonth,
        months: Months,
        days_of_week: DaysOfWeek,
        years: Years,
    ) -> ScheduleFields {
        ScheduleFields {
            years,
            days_of_week,
            months,
            days_of_month,
            hours,
            minutes,
            seconds,
        }
    }

    // Getters
    pub fn years(&self) -> &Years { &self.years }
    pub fn months(&self) -> &Months { &self.months }
    pub fn days_of_month(&self) -> &DaysOfMonth { &self.days_of_month }
    pub fn days_of_week(&self) -> &DaysOfWeek { &self.days_of_week }
    pub fn hours(&self) -> &Hours { &self.hours }
    pub fn minutes(&self) -> &Minutes { &self.minutes }
    pub fn seconds(&self) -> &Seconds { &self.seconds }
}

【问题讨论】:

    标签: rust rust-clippy


    【解决方案1】:

    missing_const_for_fn 将建议标记为const 任何可以这样标记的内容。不管它有用与否。

    这里每个函数都可以被 const-ed,所以 clippy 建议这样做。一旦你将它们标记为 const,clippy 会发现它们的大多数调用者(目前不能被 const-ed,因为它们调用非 const 函数)也可以被 const-ed。

    就个人而言,我不认为这种 lint 有用或不应该使用:很像 Copyconst 是一个非常强大和限制性的 API 承诺。它只能在仔细考虑后根据具体情况启用。

    【讨论】:

    • 我同意。仅仅因为clippy 这么说,你就应该重新考虑一下 constifying 方法。 const 的方法是签名的一部分,如果有一天它的实现需要您取消对它的约束,那么 const-context 中该方法的所有下游用户都将面临重大变化。
    • 这一切都在一个私有模块中。如果我制作这个 const,那么只有一个其他私有方法被标记为能够被 const-ed。像这样的函数是 const 的优点/缺点是什么?
    • 好处是它们可以在 const 上下文中使用,缺点是如果您更改它们的实现以使用非 const 的东西,则必须删除 const。这是否有任何相关性只有您可以说,我不知道上下文是什么,并且clippy无法执行价值判断。这里的任何人都不知道它“全部在一个私有模块中”,你只是粘贴了一个带有一堆 pub fns 的 pub 结构。并不是说这会改变任何事情:私有模块并不意味着您不能重新导出其内容。
    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2016-12-14
    • 2013-09-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多