2019/10/21_チェリー本(14日目)
はじめに
昨日もチェリー本をちょっとだけ読みました。
読んだ本
本編
読んだページ数
- 第4章(P118〜P119)
新しく知ったこと
splat展開(*
)
splat展開は、配列の前に*
を記載することで、処理の結果が配列を展開した状態になる。
配列に別配列内の要素を追加
carry = ["肉", "カレーのルー"] vegetable = ["人参", "じゃがいも", "玉ねぎ"] p carry.push(*vegetable) #=>["肉", "カレーのルー", "人参", "じゃがいも", "玉ねぎ"]
ちなみに、push(vegetable)
とすると、
["肉", "カレーのルー", ["人参", "じゃがいも", "玉ねぎ"]]
となります。(配列の中に配列が追加される)
メソッドの可変長引数
- splat展開ではないが、同じく
*
を使う - 個数に制限のない引数を設定するときに使用
def carry(*foods) puts "#{foods.join("と")}を煮込む。それがカレー。" end carry("肉", "カレーのルー", "人参", "じゃがいも", "玉ねぎ") #=> 肉とカレーのルーと人参とじゃがいもと玉ねぎを煮込む。それがカレー。
以上
2019/10/20_チェリー本(13日目)
はじめに
昨日もチェリー本をちょっとだけ読みました。
読んだ本
本編
読んだページ数
- 第4章(P117〜P118)
新しく知ったこと
配列の和集合
- 2つの配列から、要素を重複しないように返す
|
を使う
carry = ["人参", "じゃがいも", "玉ねぎ", "肉", "カレーのルー"] stew = ["人参", "じゃがいも", "玉ねぎ", "肉", "シチューのルー"] carry | stew # => ["人参", "じゃがいも", "玉ねぎ", "肉", "カレーのルー", "シチューのルー"] # 解説:`配列A | 配列B`と書く
急にカレーとシチューを同時に作りたくなっても、これで買いに行く材料の一覧が簡単に作成できます。
配列の差集合
- 一方の配列から、もう一方の配列に含まれる要素を除外して返す
-
を使う
carry = ["人参", "じゃがいも", "玉ねぎ", "肉", "カレーのルー"] stew = ["人参", "じゃがいも", "玉ねぎ", "肉", "シチューのルー"] carry - stew # => ["カレーのルー"] # 解説:`配列A - 配列B`と書く
カレーの材料からシチューの材料と重複している部分を除きました。
(結果、「カレーのルー」が残りました)
配列の積集合
- 2つの配列に共通している要素を返す
&
を使う
carry = ["人参", "じゃがいも", "玉ねぎ", "肉", "カレーのルー"] stew = ["人参", "じゃがいも", "玉ねぎ", "肉", "シチューのルー"] carry & stew # =>["人参", "じゃがいも", "玉ねぎ", "肉"] # 解説:`配列A & 配列B`と書く
カレーとシチューは、だいたい同じ材料ということがわかりました。(ルーは除く)
あとがき
毎日、例題考えるのに困っているので、これ読んでます。
海辺の週刊大衆 (双葉文庫) | せきしろ |本 | 通販 | Amazon
効果が出るといいんですが、とりあえず、楽しい本です。
以上
2019/10/19_チェリー本(12日目)
はじめに
昨日もチェリー本をちょっとだけ読みました。
次の日にアウトプットするほうが、記憶に定着するんじゃないか?と思ってきました(笑)
読んだ本
本編
読んだページ数
- 第4章(P116)
新しく知ったこと
配列内要素の変更方法
マイナスの添え字を使うと、「後ろから○番目」の要素を変更できる。
carry = ["人参", "じゃがいも", "玉ねぎ"] carry[-1] = "ねぎ" #=> ["人参", "じゃがいも", "ねぎ"] # 解説:[-1]は配列の最後の要素の意
「玉」がなくなるだけで、味の想像ができなくなりました。
指定した要素を消す(添え字ではなく、要素そのもので指定)
carry = ["人参", "じゃがいも", "ねぎ", "なす", "おくら", "かぼちゃ" ] carry.delete("ねぎ") #=> ["人参", "じゃがいも", "なす", "おくら", "かぼちゃ"] # 解説`delete(要素名)`で引数の要素を消せる
これで、他の食材をいろいろ入れずぎて、ねぎの番号がわからなくなっても安心です。
配列の結合
配列の結合方法は、以下の2つがあります。
№ | 方法 | 備考 | 例 |
---|---|---|---|
1 | contactメソッド | 破壊的メソッド (元の配列を破壊する) |
a.contact(b) ※aが変更(破壊)される |
2 | +演算子 | 非破壊的メソッド | a + b |
なので、基本的に「+演算子」を使う
あとがき
- カレーが食べたくなりました。
- 「配列の連結」の例を考えているとき、セブンイレブンで販売している「チンジャオロース焼きそば」を思い出しました。美味しかったです。
以上
2019/10/18_チェリー本(11日目)
はじめに
10/18もチェリー本をちょっとだけ読みました。 (途中で寝落ちしてしまった…)
読んだ本
本編
読んだページ数
- 第4章(P115)
新しく知ったこと
配列内の要素の取得方法
範囲を指定して取得
例
tea_material = ["はとむぎ", "玄米", "月見草", "どくだみ", "はぶちゃ", "プーアール"] puts tea_material[0,3] #=> "はとむぎ", "玄米", "月見草"
ポイント
- 書き方
配列[取得する最初の要素番号, 取得する要素数]
例では、要素番号0の「はとむぎ」から3つ、要素を取得しています。
Rangeを使っても似たようなことができます。
(↓この記事に記載)
2019/10/16_チェリー本(9日目) - 記憶の外付けHDD
後ろから○番目を取得
例
tea_material = ["はとむぎ", "玄米", "月見草", "どくだみ", "はぶちゃ", "プーアール"] puts tea_material[-1] #=> "プーアール" puts tea_material[-2] #=> "はぶちゃ" puts tea_material[-2, 2] #=>"はぶちゃ", "プーアール"
ポイント
- 添え字に
-1
を指定すると、最後の要素が取得できる。 -2
だと、最後から2番目の要素が取得できる。つまり、「最後から○番目」という日本語を「-○」に変換すればOK
前項で説明した
配列[取得する最初の要素番号, 取得する要素数]
を使えば、最後から○番目の要素から要素を△個取得することもできる- 例(
[-2, 2]
)では、最後から2番目の「はぶちゃ」から2個要素を取得している。
- 例(
そのほか(ダイジェスト)
添え字を複数指定して要素を取得(≠範囲指定)
value_atメソッドを使う
最初からn個の要素を取得
firstメソッドを使う
最後からn個の要素を取得
lastメソッドを使う
あとがき
- iTerm2を導入して、hotkeyに「shift」+「z」を指定しました。
気軽に呼び出せるので、黒い画面さんといい友達になれそうです。 - 知らないこと多すぎて、全然進まない…
(ダイジェスト方式、使って行こうかな)
以上
2019/10/17_チェリー本(10日目)
はじめに
今日もチェリー本、ちょっとだけ読みました。
読んだ本
本編
読んだページ数
- 第4章(P102〜P114)
新しく知ったこと
読んだ部分は、プログラムを作成する例題の部分でした。
そこで解説されていたリファクタリングの考え方が参考になったので、それを書きます。
例題コード
以下のコードをリファクタリングしたいと思います。
def principal(d, r, y) d.upcase + r.upcase + y.upcase + end puts principal("d", "r", "y") #=> DRY
リファクタリング①:DRY原則
- DRYとは、"Don't repeat yourself"の略
- 「繰り返しを避ける」という意味
- 例題コードの場合、
upcase
メソッドを3回も繰り返して使っている- 問題点:コードを書き換えるとき、同じ修正を3回する必要があり、書き換えをミスする可能性が高まる。
修正例
def principal(d, r, y) dry = "" [d, r, y].each do |ele| dry << ele.upcase end dry + "原則" end puts principal("d", "r", "y") #=> DRYの原則
解説
- upcaseメソッドを3回記載するかわりに、引数を配列に格納して、eachメソッドを使用しました。
リファクタリング②:適切なメソッドを使用
eachメソッドブロック処理では、Stringクラスの変数「dry」へ各要素をしている。
この部分は、injectメソッドを使用すると、もっとすっきり書けます。
※ injectメソッドは2019/10/15_チェリー本(8日目)で解説してます。
修正例
def principal(d, r, y) [d, r, y].inject(""){ |dry, ele| dry + ele.upcase } end puts principal("d", "r", "y") #=> DRY
- injectメソッドを使えば、変数 dryの定義が不要
do~end
も{~}
に書き換えた
ということで、コードをスッキリさせることができました。
あとがき
リファクタリングをしてきましたが、"dry".upcase
で済む内容なんですよね…
例題考えるの、むずかしい!!
以上
2019/10/16_チェリー本(9日目)
はじめに
今日もチェリー本、ちょっとだけ読みました。
読んだ本
本編
読んだページ数
- 第4章(P99〜P102)
新しく知ったこと
Rangeオブジェクト
- 値の範囲を表すオブジェクト
..
は最後の値を含む1..4
は「 1以上4以下」
...
は最後の値を含まない1...4
は「1以上4未満」
Rangeオブジェクトの便利な使い方
配列から一部を抜き出す
- 配列から一部要素を抜き出すときに、Rangeオブジェクトを使用できる
例
position = ["喜", "怒", "哀", "楽"] puts position[1..2] #=>怒, 哀
- ネガティブな感情だけを抜き出すことができました。
[1..2]
の記載で、配列の「2番目以上3番目以下」の要素を抜き出せます。
文字列から一部の要素を抜き出す
- 文字列から一部要素を抜き出すときも、Rangeオブジェクトを使用できる
例
chosyu = "リキラリアット" puts chosyu[2..6] #=> ラリアット
- 長州感が一気になくなり、滑舌がよくなった気がします。
- [2..6]の記載で文字列の3文字目から7文字目を抜き出せました。
以上以下、以上未満を判定する
例
# 平成かどうかを判別するメソッド def heisei?(age) (1989..2019).include?(age) end heisei?(1988) #=> false heisei?(2000) #=> true
- 論理演算子(<,>,=)を使うよりも、Rangeオブジェクトを使ったほうが、簡単に記載できる
- case文でも使える 例
# 昭和か平成か判定するメソッド def age(num) case num when 1926..1988 puts "昭和" when 1989..2019 puts "平成" else puts "ググってください" end end age(1988) #=> 昭和 age(2000) #=> 平成
値が連続する配列を作成する
to_a
メソッドで配列化する
("a".."d").to_a #=> ["a", "b", "c", "d"]
[*]
(splat展開)でも配列を作成できる
[*"a".."d"] #=> ["a", "b", "c", "d"]
以上
2019/10/15_チェリー本(8日目)
はじめに
今日、仕事が急遽夜勤になったんですが、「こ、これだけは…」と思い、ちょっとだけ読みました。
読んだ本
本編
読んだページ数
- 第4章(P○○〜P○○) ※ kindle版を使ったので、わかんないっす…
新しく知ったこと
inject
メソッドとreduce
メソッド
- 配列の各要素に対して処理を行うが、大きな特徴として前の要素に対して行った処理の結果を次の要素の処理に引き継げる
reduce
メソッドはエイリアスメソッド
例
number = [ 1, 2, 3 ] number.inject("加藤") { |result, n| result + n.to_s } #=> "加藤123"
数列かと思いきや、人名が出来あがりました。
解説
- ブロックの第1引数には、ブロックの処理の結果が引き継がれる
- 1回目はinjectメソッドの引数("加藤") が入る
- 2回目は 1回目の処理の結果("加藤1") が入る
- ブロックの第2引数は、配列の要素が格納される。
&:
- ブロック処理は、
&:
に置き換えることができる。
例
以下の2つは同じ挙動をする
# 1 ["ddt", "sto", "stf"].map{ |ele| ele.upcase } # 2 ["ddt", "sto", "stf"].map(&:upcase) #=> ["DDT", "STO", "STF"]
解説
&:
で書き換えられる条件は以下の通り
- ブロック引数が1つだけ
- ブロック内のメソッドに引数がない
- ブロック内では、メソッドを呼び出すだけ
(複数の処理を実行できない)
(演算子はメソッドでないので不可)
あとがき
ブログの記載で例を考えるのに時間がかかっているなーと 気付き、例に使い題材を絞ったらいいんじゃないか?と思いました。
なので、今後は日本史、プロレスが多めになると思いますDDTの由来って、殺虫剤らしいです。知らなかった… DDT(プロレス技) - wikipedia)
以上