代码之家  ›  专栏  ›  技术社区  ›  artemave

数组bang方法的性质

  •  15
  • artemave  · 技术社区  · 14 年前

    一些爆炸版本的 Array 方法就像 compact! , reject! flatten! uniq! 返回 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 回复  |  直到 10 年前
        1
  •  18
  •   potashin    10 年前

    爆炸( ! nil 如果没有受影响的元素 the documentation . 无论出于何种原因,如果确实修改了所讨论的数组,那么这将非常有用。

    if array.flatten!
      puts "Oh yeah... flattened that array!"
    end
    
        2
  •  4
  •   Yaser Sulaiman    14 年前

    bang版本 Array 方法是 只是他们的方式不同 就地修改对象。

    也许这里的问题是,这种印象其实并不正确: according to David A. Black , ! ! .

    现在危险有多种形式( 重点矿山 ):

    有时你得到的不止一种 方法。采取 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
    

    这个!在里面 格苏布! 给你一个提示: 它警告你有危险,这意味着 在你使用这个方法之前 (简单的) ri String#gsub! " 应该这样做。)

    这种“抬头”语义也适用于 数组 .

    推荐文章