せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】パーフェクトRuby 学習感想文 ~余談:Arrayクラスの公式ドキュメント

RubyのArray(配列クラス)を確認する。
http://doc.ruby-lang.org/ja/1.9.2/class/Array.html

(参考・経緯など)
パーフェクトRuby 学習感想文 ~はじめに


はい。
割としんどいです。


続けます。


本当はこういう各メソッドの挙動だけではなくて、
どういう思想があってメソッドが存在して、かつ、こういう動きなのか、が分かりたい。。のだけど。

 

参照渡し?値渡し?

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

object_idメソッドを使うと良さそう。
確かめよう

 

ary = Array.new(3, "foo")

p "foo".object_id
p ary[0].object_id 
p ary[1].object_id 
p ary[2].object_id 

■実行結果

23863404
23863428
23863428
23863428

なるほど。


 

おっ、って思ったものメモ

ary = [0, 1, 2, 3, 4, 5]
ary[1..3] = "x"
p ary  # => [0, "x", 4, 5]


 
===
combinationメソッド、実装どうなってるんだろう。
アルゴリズム、って感じ。↓

a = [1, 2, 3, 4]
a.combination(1).to_a  #=> [[1],[2],[3],[4]]
a.combination(2).to_a  #=> [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
a.combination(3).to_a  #=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
a.combination(4).to_a  #=> [[1,2,3,4]]
a.combination(0).to_a  #=> [[]]: one combination of length 0
a.combination(5).to_a  #=> []  : no combinations of length 5


 
===
each_indexメソッドは、最初は必須メソッドだと思ったけど、
while文で表現すれば、使わなくてもいける。



 
===
ブロックの「何番目」って、nth という変数で書いてる。
いつもどう書いたらスマートか迷ってたんだ。まねしよう。

a = [1, 2, 3, 4, 5]
result = a.fetch(10){|nth| ・・・


 
====
flatten もアルゴリズム、って感じ

a = [1, [2, 3, [4], 5]]
p a.flatten                     #=> [1, 2, 3, 4, 5]


 
====

s = ""
	[82, 117, 98, 121].each {|c| 
		p c.chr 
		s << c
	}
   p s

■実行結果

"R"
"u"
"b"
"y"
"Ruby"


 
======

a = [1, 2, 3]
a.permutation.to_a     #=> [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]


 
======

a = [ 1, 2, 3 ]           #=> [1, 2, 3]
a.shuffle!                #=> [2, 3, 1]

いままで、

a = (1..10).to_a.sample(10)

とか、sampleメソッド使ってたけどshuffleのほうが楽や。


 
=====
何でこの挙動で、メソッド名がzipっていうんだろう

p [1,2,3].zip([4,5,6], [7,8,9])
    # => [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

おわり。
やっぱりRubyはアルゴリズムの遊び心があるメソッドがおおい。
こうなるとwhat_methods を使いこなせたほうが便利。

明日はwhat_methodsを便利に使えるように設定しよう。

寝る。。。