• ベストアンサー

Array.newが必要ないのはなぜですか?

以下のようなクラス拡張をしてみました。 Class String def count_word Array.new(ary) ary = self.split(/\s/) return ary.size end end ここで、Array.new()のところでエラーになってしまいます。 感覚的に配列で受け取るようにするべきだと思っていたの ですが、この1行を外すと正常に動きます。 なぜ配列を生成するのがまずいのでしょうか?

  • Ruby
  • 回答数2
  • ありがとう数18

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4850/10264)
回答No.2

配列の作成は、split メソッドが行います。splitは、「文字列を分割して、それぞれの切れ端からなる配列を新たに作り出して返す」という動作のメソッドです。 その前に、ary = Array.new と配列を生成しても別にかまわないのですが、せっかく生成しても、何も使われないまま捨てられてしまいます。 Array.new(ary) は何も代入してない変数aryを参照するのでエラーです。

gurikoro
質問者

お礼

そうなんですか・・・ このタイミングで配列を生成しても捨てられてしまう んですね。String#splitが配列を生成するというのは 知りませんでした。ありがとうございました。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>Array.new(ary) これは、既にある ary から配列を作成するのでおかしいですよね。 ary は split の戻り値を受ける時に作成されるので、ary = Array.new() する必要もありません。 ついでに return self.split(/\s/).size とすれば ary も不要ですね。

gurikoro
質問者

お礼

なるほど。僕が勘違いしてるんですね。 最後の1行は、仰るような書き方の方がかっこいいですね。 ありがとうございました。

関連するQ&A

  • 配列について。new Arrayの省略形?

    下記No.4さんのfilterのトコで分からないことがあるので教えてください http://okwave.jp/qa/q8217521.html (data.filter (isNotNull, ary), ary)は、 最終的に(["1", "5"], [0, 3])になると思うのですが、 それがどうして最後で[0, 3]になるのでしょうか? (["1", "5"], [0, 3])は、new Arrayの省略形でしょうか? この書き方の意味が分かりません。 多次元配列みたいになるのではなく、上書きされていく?

  • array_mapの再帰処理がうまく行かない

    長文で失礼します。 array_mapでの再帰処理がうまく行かないのでどこが間違っているか教えてください。 まず、このような配列があります。配列の中に配列があります。 $ary = array(1, 2, null, array("a", null, "c")); この配列の中のnullを"なし"という文字列に変換したいです。 array_mapを使って再帰的にやってみました。 まずはうまく行ったコードから。 ------------------------------------------------------ $ary = array(1, 2, null, array("a", null, "c")); var_dump(null2Nashi($ary)); // nullを"なし"に置換する関数 function null2Nashi(  $in_array ){  if(is_array($in_array)){   return array_map("null2Nashi", $in_array);  } else {   if ($in_array === null){    $in_array = "なし";   }   return $in_array;  } } ------------------------------------------------------ 結果はnullが"なし"に変換されました array (size=4)  0 => int 1  1 => int 2  2 => string 'なし' (length=6)  3 =>   array (size=3)    0 => string 'a' (length=1)    1 => string 'なし' (length=6)    2 => string 'c' (length=1) そしてこの"なし"をコード内で指定するのではなく引数で指定したいと思って無名関数を使って以下のコードにしました。 ------------------------------------------------------ $ary = array(1, 2, null, array("a", null, "c")); var_dump(null2Str($ary, "なし")); // nullを指定文字列に置換する関数 function null2Str(  $in_array, // null値を含む配列  $in_str // null値を変換したい文字列 ){  $n = function($n_array) use($in_str){   if(is_array($n_array)){    return array_map($n, $n_array); //…(1)   } else {    if ($n_array === null){     $n_array = $in_str;    }    return $n_array;   }  };  return $n($in_array); } ------------------------------------------------------ 結果はnullは何も変換されませんでした。 array (size=4)  0 => int 1  1 => int 2  2 => null  3 =>   array (size=3)    0 => string 'a' (length=1)    1 => null    2 => string 'c' (length=1) どうやら(1)のarray_mapが動作していないようです。要素を分解せずに$nの無名関数に渡さずにそのまま第2引数を返しているだけみたいです。 何か対応方法があるでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • NEW ARRAY!!

    配列にデータを格納しようとしているのですが、 うまくいきません。アドバイスをお願いいたします。 -------------- <?php <省略> $number = 100; <省略> ?> <script language="javascript"> <!-- Begin arr = new Array(10); for(i=0;i<10;i++){ arr[i] = <?=$number?> - 1; } // End --> --------------------------- 配列arrにデータ('100','99','98', ・・・, '91')と 格納したいのですが、うまくいきません。 宜しくお願いいたします。

  • Rubyのクラス

    class Test def initialize @ary = Array.new(size){false} end def print _print end def _print print"#{@ary}" end end test = Test.new(5) test.print 上記のプログラムはエラーが出て実行できません。期待している動作は[false,false,false,false,false]です。どうしてエラーが出るか教えていただきたいです。また、解決策もよろしくお願いします。

    • ベストアンサー
    • Ruby
  • perlのクラスについて

    perlでクラスを作成しています。その際、コンストラクタnewで無名配列を定義して、funcメソッドで、この無名配列に値をいれるにはどうすればよいでしょうか? sub new { my $class = shift; my $self->array = []; bless($self, $class); return $self; } sub func { my $self = shift; $self->arrayに配列のデータを入れる。 }

    • ベストアンサー
    • Perl
  • Array#eachのブロック中で要素追加

    初歩的な質問で申し訳ありません ary = [Foo.new] ary.each do |i|  if (条件)   ary.push(Foo.new)  end end 上の様にブロックの中である条件でaryに要素が追加されます。 この場合、この追加された要素はeachで漏れなく扱えるのでしょうか? 簡単なプログラムで試した限りではpushされたFooインスタンスについてもeachで取り出せているようなのですが、自信が無いので質問致します。 # coding: windows-31J class Foo attr_accessor :checked attr_reader :val RAND_MAX = 5 def initialize rnd = Random.new @checked = false @val = rnd.rand(RAND_MAX).to_i end end ary = [Foo.new] ary.each do |f| if f.val > 0 ary.push(Foo.new) end f.checked = true end cnt_true = 0 cnt_false = 0 ary.each_index do |idx| print "#{idx} #{ary[idx].checked} #{ary[idx].val}\n" if ary[idx].checked cnt_true += 1 else cnt_false += 1 end end puts "checked true = #{cnt_true}" puts "checked false = #{cnt_false}" よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Rubyの問題について質問です。

    Rubyの資格試験の勉強をしています。 分からない部分がありまして質問させていただきます。 class Employee attr_reader :id attr_accessor :name def initialize id , name @id = id @name = name end def to_s return "#{@id}:#{@name}" end def <=> other return self.id <=> other.id end employees = [ ] employees <<Employee.new("3","Tanaka") employees<<Employee.new("1","Suzuki") employees<<Employee.new("2","Sato") employee.sort! (質問) 「return self.id <=> other.id」この部分のselfとotherが何をさしているのか分かりません。3つめでインスタント化している「employees<<Employee.new("2","Sato")」のは、selfに入りそれまでに入れた値はotherに入っているのでしょうか? ご回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby初歩的な質問です。::はなんですか?

    ruby初心者です。 def ball_sakusei @ball = Array.new(BallMaru::BALL_KAZU){BallMaru.new(self)} end という行があったのですが、 BallMaru::BALLの部分の::はどういう意味ですか? 調べたけどよくわかりませんでした。 教えてくださいよろしくお願いします。

    • ベストアンサー
    • Ruby
  • RUBYのプログラムわかりません。

    昨日からRUBYを始めた初心者です。 BOX-COX変換を見て、コードを 動かそうとしましたが、NEW演算子?でエラーが 出たりして動きません。WINDOWS版ですがどのように すれば動くのでしょう。NEW演算子はクラス以外の 生成でどう使うのでしょう?下記NEW演算子の ところを抜き出しました。 どうぞよろしくお願い致します。 ar=[5.5,4.0,6.0,5.0,5.0,4.0,4.3] def Box_Cox1(ar, add)   ary=[1.2,2.0]   transformed_dn = ary.new() return ar.size end add = "0.01" begin p Box_Cox1(ar, add) end

  • 配列のソートと削除

    String型のstrToRemoveで与えられた文字列を配列から探し、あればそれ以降の配列の数字をすべて左にシフトします。 なので配列の大きさは1小さくなります。その結果の配列をreturnで返します。 例) ({"A","B","C","D","B"}, "B")配列1にBがあるのでそれ以降の文字列をすべて左にシフト→ {"A","C","D","B"} ({"A","B","C","D","B"}, "A") 配列0にAがあるのでそれ以降の文字列を左にシフト→ {"B","C","D","B"} プログラムは以下のように組みました。 public class ArrayFun { public String[] oneRemoved(String[] array, String strToRemove) { int count = 0; for (int i = 0; i < array.length; i++) {      if (strToRemove.equals(array[i]) && count == 0) {        for (int j = i; j < array.length - 1; j++) {          array[j] = array[j + 1];        }          count++;      } }      array = new String[array.length - 1];      array[array.length - 1] = null;      return array; } } ちなみにcountは、一度シフトすればもう同じ文字列がそれ以降の配列にあってもシフトはしないので、countでシフトしたかどうかを判断しようと思い付けました。 これでテストメソッドも作るのですが、 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testoneRemoved() { ArrayFun af = new ArrayFun(); String[] a1 = {"A","B","C","D","B" };//元の配列 String[] a2 = {"A","BB","CCC","DDD","B"};//元の配列 String[] a3 = {"B","C","D","B"};//シフト後の配列 String[] a4 = {"A","BB","CCC","DDD","B"};//シフト後の配列 assertEquals(a3, af.oneRemoved(a1, "A")); assertEquals(a4, af.oneRemoved(a2, "NotHere")); } } 以上のように組むと、assertEqualsの真ん中に黒線が入って自動的に@SuppressWarnings("deprecation")が加えられてしまいます。 実行結果は、({"A","B","C","D","B"}, "A") の例だと、配列0にB が入るはずがnullになっている、とエラーがでます。 どのようにしたら正常に動かせるでしょうか?宜しくお願いします。

    • ベストアンサー
    • Java