20210329_アウトプット(Ruby)
1%の成長
- ゼロからわかるRuby超入門(3時間半)
新しい発見
sizeメソッドとlengthメソッドはエイリアスメソッド(別名メソッド)
私🤔:配列の要素数ってどうやって数えるの?
先生🥸:sizeメソッド
やlengthメソッド
で数えることができるよ。
私🤔:異なるメソッド名でも、同じ実装になるんだね。
先生🥸:うん、それらをエイリアスメソッド(別名メソッド)といい、文脈や好みで使い分けるよ。 同じ実装でも速度が違う場合があるので、速さを一つの基準にしてもいいかもしれないね。
puts [2, 4, 6].size #=>3 puts [2, 4, 6].length #=>3
require 'benchmark' Benchmark.bm 10 do |r| r.report "size" do end r.report "length" do end end # 結果 user system total real size 0.000011 0.000010 0.000021 ( 0.000007) length 0.000003 0.000001 0.000004 ( 0.000003)
配列の全要素の合計を得るにはsumメソッド/平均を出すにはそれをsizeメソッドかlengthメソッドで割る
- 注意としては、合計値を使って平均を出すときに、デフォルトは整数になっているので
to_f
(小数)に変換するメソッドを使わないと正しい値がでない場合があること。
a = [1, 2, 2] puts a.sum / a.size #=> 1 puts a.sum.to_f / a.size #=> 1.6666666666666667
uniqとuniq!の違いは何?/新しい配列を作り出すか・配列そのものを変更(破壊的)するか
- 末尾に!がつく/つかないメソッドがある。
- !がつくと、オブジェクトを破壊的に変更し、!がつかないと新しい配列を作って返すものが多い。
ブロックを渡せるメソッド
p [1, 3, 2, "2", "3"].uniq # => [1, 3, 2, "2", "3"] p [1, 3, 2, "2", "3"].uniq { |n| n.to_s } # => [1, 3, 2]
- 2つめはブロックで一つずつ、配列の中身を全て文字列にしてから重複を取り除いている(これを
to_i
にして全て整数にしてから重複を取り除くでも結果は同じ)
配列をランダムに操作
メソッド | 内容 |
---|---|
sample | 配列の中からランダムで一つ選ぶ |
shuffle | 配列の中身をランダムに並び替える |
配列の並びかえ
私🤔:そのまま、reverseメソッドを使う時と、sortメソッド+reverseメソッドの違いは何?
先生🥸:配列の中身を「そのまま逆」にするか、中身が大きい順/小さい順、アルファベット順(かつ大文字優先)など並び替えたものをリバースするかの違いだよ。
ary1 = [ "d", "a", "e", "c", "A" ].sort.reverse #=> ["e", "d", "c", "a", "A"] ary2 = [1, 2, 4, 5, 6, 4, 0].sort.reverse #=> [6, 5, 4, 4, 2, 1, 0]
- 注意点としては、「文字列」の数字をソートした時は、正しく大きい順/小さい順にならないので、uniqメソッドで学んだ時のようなブロックにして(全てto_iメソッドで変換して)並び替えるよ。また大小の比較をしながら並び替えるため、ブロック引数として2つ渡す必要があるよ。
p ary2.sort{|a, b| a.to_i <=> b.to_i } #=> ["7", "8", "9", "10", "11"] (ブロックを使って数字としてソート)
配列の「中身」をくっつけるjoinメソッド
- 配列の中身をくっつける
- くっつける時に、要素間に指定の文字を入れて欲しい
というような場合は
joinメソッド
が便利!
puts ["りんご", "みかん", "いちご"].join("と") #=>りんごとみかんといちご puts ["りんご"].join("と") #=>りんご
- とても便利だと感じたのは、要素が一つの時には「連結していない」と判断してつかないようになること。
文字列を分割して、配列にするsplitメソッド
- 文字列と文字列の間は「半角スペース」分空いている、「”と”」で繋がっているなど、法則性があるときにその文字列で区切って配列にしてくれるメソッド。
puts "りんご みかん バナナ".split(" ") りんご みかん バナナ
puts "りんごとみかんとバナナ".split("と") りんご みかん バナナ
配列の中身に対して、同じように〇〇したい時に使えるmapメソッド
- 配列の各要素に対して同じ処理をして、変換後の要素を「新しい要素」として作り出すメソッド。
私🤔:eachメソッド
と何が違うの?
先生🥸:eachメソッド
は、各要素に対してブロックで処理を行うことが目的で、mapメソッド
は各要素を変換した新しい配列を作ることは目的になるよ。
puts ["赤", "白", "黒"].map do |x| "{x}色" end #=> 赤色 白色 黒色
- リファクタリングとして、
do ~ end
を{ ~ }
にできる。
result = ["abc", "123"].map { |text| text.reverse } p result #=> ["cba", "321"]
result = ["abc", "123"].map(&:reverse) p result #=> ["cba", "321"]
- また各要素に対する処理で、あるメソッドで呼び出す(処理を施す)場合については、シンボルである
&:メソッド名
で表現できる。 - ただし、これが使えるのが①ブロック引数が一つだけ②引数がないこと③メソッドを1回呼び出したら終わり、という条件が揃った時。
🤔私:&:メソッド名
ってどういう状態?
🥸先生:&
と、:メソッド名
の組み合わせ。&
はprocオブジェクト(ブロックをオブジェクト化するクラス)の一つでブロック処理を一つのカタマリにしている。:メソッド名
はシンボル(オブジェクトの種類の一つ。)にしている状態だよ。
感想
- split、mapについて、ネットでふわっとした概念で理解していたので、役割がきちんと理解できて嬉しかった。
- 今日はSPI勉強できなかったけれどRubyについて、引き出しが増えたのでよしとしよう。
- どうしても眠いので今日はもう寝る。