3054

[code]

      N = 5
      p Array.new(N){Array.new(N, false)}
      p Array.new(N, Array.new(N, false))
    
[/code]

上記２つの出力に違いがあるのでしょうか？


CC BY-SA 3.0
2015-01-04T12:01:48.817
3051
2015-01-05T01:37:39.757
5363
question
ruby
２つの配列の配列について


どちらも同じ `Array` を返します。
**ただし、Arrayを操作するときに[違いがある](https://ja.stackoverflow.com/questions/3051/%EF%BC%92%E3%81%A4%E3%81%AE%E9%85%8D%E5%88%97%E3%81%AE%E9%85%8D%E5%88%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6#3054)ようです。**

[code]

    >> N = 5
    => 5
    >> a = Array.new(N){Array.new(N, false)}
    => [[false, false, false, false, false],
     [false, false, false, false, false],
     [false, false, false, false, false],
     [false, false, false, false, false],
     [false, false, false, false, false]]
    >> b = Array.new(N, Array.new(N, false))
    => [[false, false, false, false, false],
     [false, false, false, false, false],
     [false, false, false, false, false],
     [false, false, false, false, false],
     [false, false, false, false, false]]
    >> a == b
    => true
    
[/code]

[new(size = 0, val = nil) -> Array](http://docs.ruby-
lang.org/ja/2.1.0/method/Array/s/new.html)

> 長さ size の配列を生成し、各要素を val で初期化して返します。
>
> 要素毎に val が複製されるわけではないことに注意してください。 全要素が同じオブジェクト val を参照します[[trap:Array]]。
> 後述の例では、配列の各要素は全て同一の文字列を指します。
>
> [PARAM] size:  
>  配列の長さを数値で指定します。  
>  [PARAM] val:  
>  配列の要素の値を指定します。
>
> 例:
[code]

>     ary = Array.new(3, "foo")
>     p ary                     #=> ["foo", "foo", "foo"]
>     ary[0].capitalize!
>     p ary                     #=> ["Foo", "Foo", "Foo"]  (各要素は同一のオブジェクトである)
>  
[/code]

[new(size) {|index| ... } -> Array](http://docs.ruby-
lang.org/ja/2.1.0/method/Array/s/new.html)

> 長さ size の配列を生成し、各要素のインデックスを引数としてブロックを実行し、 各要素の値をブロックの評価結果に設定します。
>
> ブロックは要素毎に実行されるので、全要素をあるオブジェクトの複製にすることができます。
>
> [PARAM] size:  
>  配列の長さを数値で指定します。
>
> 例:
[code]

>     ary = Array.new(3){ "foo" }
>     p ary                      #=> ["foo", "foo", "foo"]
>     ary[0].capitalize!
>     p ary                      #=> ["Foo", "foo", "foo"]  (各要素は違うオブジェクトである)
>  
[/code]

引用: [オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル](http://docs.ruby-
lang.org/ja/2.1.0/doc/index.html)


CC BY-SA 3.0
2015-01-04T12:22:45.533
3052
2015-01-05T01:37:39.757
2017-04-13T12:52:38.920
-1
724
3051
answer


同じです。ただし、二つは異なる配列であることに注意してください。

以下のようにすると、構造の違いが明らかになります。

_Array.new(N){ Array.new(N, false)}_ :

[code]

    N = 5
    a_block = Array.new(N){Array.new(N, false)}
    a_block[0][0] = true
    p a_block
    
    # => [[true, false, false, false, false],
    #    [false, false, false, false, false], 
    #    [false, false, false, false, false], 
    #    [false, false, false, false, false], 
    #    [false, false, false, false, false]]
    
[/code]

**vs**

_Array.new(N, Array.new(N, false))_ :

[code]

    N = 5
    a_instant = Array.new(N, Array.new(N, false))
    a_instant[0][0] = true
    p a_instant
    
    # => [[true, false, false, false, false], 
    #    [true, false, false, false, false], 
    #    [true, false, false, false, false], 
    #    [true, false, false, false, false], 
    #    [true, false, false, false, false]]
    
[/code]

ドキュメントの以下の部分の解釈に注意して理解するようにしてください。 (以下の部分は itochan の回答を引用させてもらっています。)

> [_](http://docs.ruby-lang.org/ja/2.1.0/method/Array/s/new.html) 長さ size
> の配列を生成し、各要素のインデックスを引数としてブロックを実行し、 各要素の値をブロックの評価結果に設定します。

**vs**

> [_](http://docs.ruby-lang.org/ja/2.1.0/method/Array/s/new.html) 長さ size
> の配列を生成し、各要素を val で初期化して返します。


CC BY-SA 3.0
2015-01-04T12:45:06.710
3054
2015-01-04T12:50:38.883
2015-01-04T12:50:38.883
4978
4978
3051
answer