标签: ruby-on-rails ruby
我有以下数组和方法:
array = ["1", 0, "a", ""] array.reject(&:blank?).map(&:to_i).reject{|i| i == 0}
如果我想使用感叹号保存更改,例如.map!(&:to_i),是否应在每种方法之后放置标记或以其他方式 - 在哪里?
.map!(&:to_i)
答案 0 :(得分:4)
感叹号不是修饰符。
array.reject!(&:blank?).map!(&:to_i).reject!{|i| i == 0}
然而,这段代码是巧妙的错误。来自reject! docs:
reject!
如果没有做出任何更改,将返回nil。
将返回nil。
糟糕!这可能会打破你的整个链条。相反,你应该使用delete_if,它总是返回数组。
array.delete_if(&:blank?).map!(&:to_i).delete_if{|i| i == 0}
是的,令人困惑的是它没有爆炸,但它确实就地修改了。来自文档:
每次调用块时,数组都会立即更改,而不是在迭代结束后更改。