はじめに

最近よくRubyとPHPを書いてます、米山です。
先日、ループ回数によって処理を変える、というコードを書いていたときにeach_with_indexメソッドに出会いました。

今更感がありますが、私の中では割とビックニュースだったので、ブログに書きたいと思います。

each_with_indexメソッドって?

Rubyの組み込みメソッドで、Enumerableクラスに属します。
(Enumerableは配列やハッシュなど、数えられるもの全般の親クラスです。)
リファレンスはこちら→each_with_index

使い方はシンプルで、配列などから要素を取り出すときに、一緒にインデックスも取り出してくれます。

irb(main):001:0> animals = ["dog", "cat", "rabit"]
=> ["dog", "cat", "rabit"]
irb(main):002:0> animals.each_with_index do |animal, index|
irb(main):003:1*      p "#{index}週目の動物は#{animal}です"
irb(main):004:1> end
"0週目の動物はdogです"
"1週目の動物はcatです"
"2週目の動物はrabitです"
=> ["dog", "cat", "rabit"]

便利だと思ったわけ

Ruby以外だと、PHP(ちょっとだけPython)も書きますが、PHPで書こうとすると、以下のような感じでしょうか。

php > $animals = ["dog", "cat", "rabit"];
php > for ($index = 0; $index < count($animals); $index++) {
php {       print("{$index}週目の動物は{$animals[$index]}です\r\n");
php { }
0週目の動物はdogです
1週目の動物はcatです
2週目の動物はrabitです

配列からの取り出しが面倒くさいですね。
また、こちらの場合は連想配列では対応できなくなりそうです。。。

ちなみにPythonでは…

Pythonでも調べてみたところ、インデックスつきでループしてくれるenumerateがありました。
リファレンスはこちら→enumerate

>>> animals = ["dog", "cat", "rabit"];
>>> for index, animal in enumerate(animals):
...         str = "%d週目の動物は%sです" % (index, animal)
...         print(str)
... 
0週目の動物はdogです
1週目の動物はcatです
2週目の動物はrabitです

RubyとPythonのコードは似ているという話をよく聞きますが、メソッドもあるものなのですね。

さいごに

探して見ると、私程度が思いつきそうな面倒なことはだいたい既にメソッドとして存在していたりします。
こんなのあったらな、と思ったらまずは調べて見ようと思います。

Shere
  • はてなブログ
  • Twitter
  • Facebook
個人的にRubyのeach_with_indexメソッドに感動した話

Writer

  • Name

    Naoki

  • Position

    RubyやPHPが書きたい雑用

  • Profile

    最近、(自称)PHPerから(自称)Rubyistに移行しようと考えている雑用です。Rubyのオブジェクト 指向はすごい分かりやすいので好きになりました。また、メソッド名に?が使えるのも良いですよね!