0

我有如下结构,Rubocop 抱怨我试图安抚

unless foo && !foo.empty? ...

(项目存在且不为空)

bar && !bar.positive?

(项目存在且不是正数)

在这两种情况下,Rubocop 都会抛出 aStyle/SafeNavigation并说我应该使用它&.。但是,似乎没有办法编写它。

在这两种情况下,问题的一部分是没有表达相反函数的简洁方式 - 字符串没有“非空”,数字没有“负数或零”。例如,写入bar&.negative?返回零的相反结果。

在另一种情况下,写作unless !foo&.empty?使 Rubocop 抱怨除非 + 否定,但同样没有办法将其重写为if foo&.存在的任何操作。

(顺便说一句,这是纯 Ruby,没有 Rails,所以我没有blank?and present?

4

2 回答 2

1

这是 RuboCop 中的一个疏忽,因为不能保证建议的更正具有相同的语义。它将在即将到来的 0.50.1 补丁中修复,并且警察将忽略带有否定的情况。

同时,如果您正在处理变量可能存在的条件,则一种选择是使用响应强制方法nil的事实。nil例如,假设foo是一个数组或nil

# With nil check
unless foo && !foo.empty?

# With array coercion
if foo.to_a.empty?
于 2017-09-23T14:48:57.827 回答
1

这个:

next unless foo && !foo.empty?

可以替换为:

next if foo.nil? || foo.empty?

同样,这个:

next unless bar && !bar.positive?

可以替换为:

next if bar.nil? || bar.positive?

在我看来,这里真正的代码味道是next unless ... not. 双重否定表示可能有一种更简洁的方式来编写它。

于 2017-09-22T14:11:25.063 回答