Поведение методов массива взрыва - PullRequest
15 голосов
/ 18 сентября 2010

Некоторые варианты взрыва Array методов похожи на compact!, reject!, flatten!, uniq! return nil, если не было сделано никаких изменений:

[1,[2]].flatten!
# => [1, 2]
[1,2].flatten!
# => nil
[1,[2]].flatten
# => [1, 2]
[1,2].flatten
# => [1, 2]

[1,2,nil].compact!
# => [1, 2]
[1,2].compact!
# => nil
[1,2,nil].compact
# => [1, 2]
[1,2].compact
# => [1, 2]

Если они сделали это таким образом, должна быть причина. Есть идеи, что это может быть?

Ответы [ 2 ]

18 голосов
/ 18 сентября 2010

Методы bang (!) действительно изменяют текущий объект на месте, но возвращают nil, если на документацию не существует затронутых элементов.Это полезно, если по какой-либо причине вам нужно что-то сделать, если вы изменили рассматриваемый массив.

if array.flatten!
  puts "Oh yeah... flattened that array!"
end
4 голосов
/ 19 сентября 2010

У меня всегда было впечатление, что взрывающая версия Array методов отличается только тем, как они изменяют объект на месте.

Возможно, проблема в том, что это впечатлениене совсем правильный: согласно Дэвиду А. Блэк , ! не означает, что метод меняет своего получателя;! означает, что этот метод является «опасной» версией эквивалентного в противном случае метода , который имеет то же имя минус !.

Теперь опасность принимает много форм ( выделение мое):

Иногда вы получаете более одного вида «опасности» даже в рамках одного метода взрыва.Возьми String#gsub!.Этот метод изменяет свой получатель:

str = "David" 
str.gsub!(/$/, " Black")
str                        # David Black

Он также отличается от gsub (без взрыва) тем, что если строка не изменяется, gsub возвращает копию неизмененной строки, но gsub!возвращает ноль:

str.gsub(/xyz/, "blah")    # David Black
str.gsub!(/xyz/, "blah")   # nil
str                        # David Black

The!в gsub! дает вам предупреждение: он предупреждает вас об опасности, и это означает, что прежде чем использовать метод, вы должны выяснить, как именно он ведет себя. (простой "ri String#gsub!" должен сделать это.)

Эта семантика "один на один" также применяется к методам взрыва Array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...