【问题标题】:Ruby rubocop: how to freeze an array constant generated with splatRuby rubocop:如何冻结使用 splat 生成的数组常量
【发布时间】:2016-12-09 23:31:57
【问题描述】:

我正在分配一个这样的数组常量:

NUMS = *(2..9)

Rubocop 说

C:冻结分配给常量的可变对象。
NUMS = *(2..9)
              ^^^^^


所以我试试

NUMS = *(2..9).freeze

Rubocop 说

C:冻结分配给常量的可变对象。
NUMS = *(2..9).freeze
              ^^^^^^^^^^^


试过

NUMS = (*(2..9)).freeze

Rubocop 说

E: 意外令牌 tRPAREN (使用 Ruby 2.0 解析器;使用 TargetRubyVersion 参数进行配置,在 AllCops 下)
NUMS = (*(2..9)).freeze
                        ^


试过

NUMS = [1, 2, 3, 4, 5, 6, 7, 8, 9].freeze

Rubocop 说

== happy_robot_dance(没有错误)

我说

我的手因输入 1、2、3、... 9 而受伤

有没有办法使用 splat 来分配和冻结常量?

---------

解决方案

NUMS = (2..9).to_a.freeze

NUMS = Array(2..9).freeze

【问题讨论】:

  • (2..9).to_a,应与[2,3,4, ...etc] 相同。想知道2..9Range 是否会导致问题。无论如何,如果原始代码有效,那么 Rubocop 的警告似乎是没有根据的。
  • 我同意,当#to_a 可用且更清晰时,没有理由使用 splat 进行数组强制。同时,这个警察不应该对此发表意见。

标签: ruby constants freeze rubocop splat


【解决方案1】:

我认为这是为了安抚 Rubocop 本身的一个案例 - 案例 2 看起来应该可以工作,因此可以被视为一个错误。但是,这行得通吗?

why_do_i_exist = *(2..9)
NUMS = why_do_i_exist.freeze

【讨论】:

  • 是的,这行得通。但我仍然不知道为什么_i_exists ... ;-)
【解决方案2】:

你可以试试:

NUMS = Array[*2..9].freeze

【讨论】:

    【解决方案3】:

    RuboCop 之前没有处理过这个案例(阅读错误。)

    我添加了一个 issue 和一个 pull request 来解决这个问题。

    同时,您可以通过在这种情况下禁用警察来让警察沉默:

    # rubocop:disable Style/MutableConstant
    NUMS = *(2..9)
    # rubocop:enable Style/MutableConstant
    

    或者你可以使用#to_a:

    NUMS = (2..9).to_a.freeze
    

    【讨论】:

    • NUMS = (2..9).to_a.freeze 看起来是清晰度和 rubocop 的最佳解决方案。先生
    • 如果你想要简洁,NUMS = [*2..9].freeze 相当于这个答案中的后一种解决方案。
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2020-01-02
    • 2021-07-18
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多