方法链接时在哪里放置感叹号

时间:2016-09-05 15:43:28

标签: ruby-on-rails ruby

我有以下数组和方法:

array = ["1", 0, "a", ""]
array.reject(&:blank?).map(&:to_i).reject{|i| i == 0}

如果我想使用感叹号保存更改,例如.map!(&:to_i),是否应在每种方法之后放置标记或以其他方式 - 在哪里?

1 个答案:

答案 0 :(得分:4)

感叹号不是修饰符。

array.reject!(&:blank?).map!(&:to_i).reject!{|i| i == 0}

然而,这段代码是巧妙的错误。来自reject! docs:

  如果没有做出任何更改,

将返回nil。

糟糕!这可能会打破你的整个链条。相反,你应该使用delete_if,它总是返回数组。

array.delete_if(&:blank?).map!(&:to_i).delete_if{|i| i == 0}

是的,令人困惑的是它没有爆炸,但它确实就地修改了。来自文档:

  

每次调用块时,数组都会立即更改,而不是在迭代结束后更改。