• ベストアンサー

配列定義の書き方

Rubyで配列を新しく定義するとき、Array.new(3,"TEST")とArray.new(3) { "TEST" }ではどう違いますか?またどう使い分けますか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#158634
noname#158634
回答No.1

Array.new(3,"TEST")、Array.new(3) { "TEST" }で生成される配列はどちらも見た目上["TEST","TEST","TEST"]ですが、両者で異なるのが「3つのオブジェクトが同一かどうか」です。 Array.new(3,"TEST")の場合 配列の中身はこの↑"TEST"という文字列です。同じオブジェクトです。 Array.new(3) { "TEST" }の場合 配列の中身は↑この部分↑つまりブロックを実行した戻り値としての"TEST"という文字列です。そして、Array#newにブロックを渡した場合、それぞれの要素について毎回ブロックが呼ばれます。つまり、毎回新しい"TEST"という文字列を生成しているので、3つの"TEST"は異なるオブジェクトです。 object_idというのがあります。これは各オブジェクトに自動的に割り当てられる数値のIDで、異なるオブジェクトは必ず異なるobject_idになります。逆に「同じオブジェクトのobject_idは同じ」と言うことになります。 @array = Array.new(3, "TEST") @array.each {|n| puts n.object_id} と @array = Array.new(3){ "TEST" } @array.each {|n| puts n.object_id} をそれぞれ実行した結果を比べれば違いがよく分かると思います。 …まあマニュアル見れば詳しく書いてあるんですけどね(笑)

参考URL:
http://doc.okkez.net/static/192/class/Array.html
rinrin_ring
質問者

お礼

ありがとうございます。ブロックを使うと同じ"TEST"でも違うものが入るんですね。 マニュアルしっかり見ます。すみません……

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 配列名の定義の仕方?

    配列名を操作したいのですがうまくいきません。やりたいことは下記の★部分で配列名を定義したいのですが、定義の方法がうまくいっていないようです。 //配列名と要素を設定 var station1 = new Array("東京","渋谷","新宿"); var station2 = new Array("横浜","藤沢","川崎"); var station3 = new Array("千葉","浦安","津田沼"); //★任意の番号を設定し配列名を定義 var no = 1; //ここでは仮に1とする var arrayName = "station" + no; ←ここで「station1」としたい document.write(arrayName[2]); 上記ではうまくいきません。どうやったらstation1という配列名を作って要素を取得できるのでしょうか?

  • 多次元配列は配列の配列である

    Java勉強中なんですが、参考書を読んでいて「多次元配列は、実際には配列の配列である。つまり、2次元配列(array[][])がある場合、実際にはこれをarray[0]、array[1]、array[2]、といった1次元配列に配列として扱う事ができる。」と書いてあり、例題で、 double array[][] = new double[5][]; array[0] = new double[500]; array[0] = new double[400]; array[0] = new double[300]; array[0] = new double[200]; array[0] = new double[100]; と書いてありました。これについてのこれ以上の説明はなく、理解できなくて困っています。ご教授宜しくお願いいたします。

    • ベストアンサー
    • Java
  • 関数で定義した配列のソート

    お世話になります。 配列のソートは xx = new Array(3, 7, 8, 1); xx.sort(); document.write('xx='+xx+'<br>'); function hikaku(a, b) { return(b - a); } yy = new Array(3, 7, 8, 1); yy.sort(hikaku); document.write('yy='+yy+'<br>'); で、できました。 ここで、 function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01'), ); と、配列goodsを定義します。 そして、例えばvalueで並び替えた配列を取得するなんてことはできないでしょうか。 よろしくお願いします。

  • 配列の定義について

    配列とは、同じ形式のデーターを連続した記憶領域で確保するためのものである。 配列を構成する個々の領域を要素と呼び、要素の位置を添え字で示す。 Javaでは配列の先頭の要素を(0)番目と呼ぶ。 今、hairetsuという名前で10個の整数からなる配列を定義したい。 この場合の配列は(0)番目から始まり、終端は(9)番目である。 これを定義するには (int[] hairetsu;) (hairetsu = new int[10];) のように2行で行う方法と、 (int[] hairetsu = (new int[10];) のように、一行で行う方法がある。 Javaでは定義済みの配列の要素数は、配列変数名.(length)で知ることができ、 終端は(length + 1)番目となる。 したがって(length + 1)番目以降を使おうとすると、 配列要素の範囲外で(例外)が発生する。 この文章の( )の中は間違っていますか?

    • ベストアンサー
    • Java
  • 配列の中にもう1度配列を宣言?

    今知人から昔に貰ったソースプログラムを読んでいます 自分の知識不足でどのようになっているのかわからない箇所があるので教えていただけると助かります 一部抜粋 test = new Array() for(i=0; i<9; i++) { test[ i ] = new Array() } 上記のコードは配列の中にまた更に配列を作成していると言うことで2次元配列なのでしょうか? わざわざこのような書き方をしたと考えられる事がありましたら教えていただけると助かります

    • ベストアンサー
    • Flash
  • 二次元配列

    質問失礼します。 二次元配列の練習中で、 nijigen = new Array(); nijigen[0] = new Array(0,0,0,0); nijigen[1] = new Array(0,0,0,0); nijigen[2] = new Array(0,0,0,0); nijigen[3] = new Array(0,0,0,0); という配列を作りました。 そして、その配列と同じ配置にされたボタンを押すと、その位置の配列の数値に「1」が代入されるというものです。 そこでですが、「配列の内容が全て1になった時」を検知出来るようにしたいのですが、どのようにすればよいのでしょうか。 よろしくお願いします。 //↓こうなった時に検知したいのです nijigen = new Array(); nijigen[0] = new Array(1,1,1,1); nijigen[1] = new Array(1,1,1,1); nijigen[2] = new Array(1,1,1,1); nijigen[3] = new Array(1,1,1,1);

    • ベストアンサー
    • Flash
  • PHPのようにスマートに配列の配列など記述する方法が

    PHPの場合、データ構造ですが以下のようになっています。 $a = array( "test1" => array( array(1,1), array("x", 2) ), "test2" => array( array(3,2), array("y", 1) ), ); これをエクセルVBAの場合、Scripting.Dictionaryを使えば連想配列が 可能ですが、PHPのようにスマートに配列の配列など記述する方法が わかりません。 Dim dic As Scripting.Dictionary set dic = New Scripting.dictionary dic.Add "test1", ???????????????? dic.Add "test2", ???????????????? スマートにデータ構造を実現できる方法が知りたいです。

  • ruby on railsのscaffoldで配列を定義するには

    ruby on railsのscaffoldで配列を定義するには rails2.3での質問です。 通常、scaffoldで >ruby script/generate migration TestData name:string id:integer のようにデータ構造を指定すると思うのですが、この時に配列を定義するには どうしたら良いのでしょうか? 通常の(C言語のような)配列でもハッシュでも構いません。 よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 規則性がある配列名のキー毎に新たな配列を生成したい

    ■やりたいこと ・元配列の配列名「○○_数字」の数字が小さい順に並べ替えた後、キー毎に新たな配列を作成したいです ■元配列   [test_1] => Array     (       [0] => dummy1_0       [1] =>       [2] => dummy1_2     )   [test_3] => Array     (       [0] =>       [1] => dummy3_1       [2] =>     )   [test_2] => Array     (       [0] => dummy2_0       [1] =>       [2] => dummy2_2     )   [test_4] => Array     (       [0] =>       [1] => dummy4_1       [2] =>     ) ■作成したい配列   [result_1] => Array     (       [0] => dummy1_0       [1] => dummy2_0       [2] =>       [3] =>     )   [result_2] => Array     (       [0] =>       [1] =>       [2] => dummy3_1       [3] => dummy4_1     )   [result_3] => Array     (       [0] => dummy1_2       [1] => dummy2_2       [2] =>       [3] =>     )

    • ベストアンサー
    • PHP
  • JavaScriptでオブジェクトの配列

    function myfunc() {} で定義したようなオブジェクトを var arr = new Array(); arr.push()で配列に入れて、あとから取り出す際に arr[0]をmyfunc型として使うにはどうすればよいでしょうか? キャストのようなものも多分なさそうですし。