fjord/cherry.md
2024-03-19 22:26:33 +09:00

78 lines
8.2 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 3/16
Rubyの真偽値はfalseまたはnil以外はすべてtrueRuby固有の特徴
if文の戻り値を変数に代入できるgreeting = if country == 'japan' elsif...のように書ける
メソッド名はスネークケースで書くhello_world のような形式
%記法でエスケープが不要になる:%!unkoburi!のように囲える
ヒアドキュメント:<<-識別子 テキスト 識別子 の形式で複数行の文章を格納できる式展開も使える <<-を途中で使うとインデントされる引数として渡すこともできるヒアドキュメントを二つ使うと配列を作れるこれすごい便利じゃないか
配列の結合[10,20,30].join で全部くっつく
unlessifの逆 でもこれ逆に頭がこんがらがりそう
==true , ==false は冗長なので使わないそれはそうだ
case文絶対に使うべき局面でもなぜか忘却してif文を使ってしまう message = case xxx when 'yyy' end のように使う
三項演算子絶対に使うべき局面なのになぜか忘却して以下略 ? 真だった場合の処理 : 偽だった場合の処理 のように使う
メソッドにデフォルト値の引数を付けるdef greet(country = 'japan')などで引数なしでjapanが引数として扱われる。(x, y=xのようにするとyが無指定の場合にxと同じ値として扱われる
!で終わるメソッドは破壊的メソッドだがついていないからといって破壊的ではないとは限らないconcatは付いていないが破壊的
エンドレスメソッド定義 endがいらないdef greet = 'hello!'
lengthとsizeはどちらもまったく同じメソッドなにか違うはずだろと思っていたのに……
標準ライブラリと組み込みライブラリはイコールではない同じだと思ってた
putsとprintの差は改行の有無だがpはオブジェクトそのものがメソッドの戻り値になるp 123の後に123を参照すると123が戻ってくるputsの場合はnil)、ppはpよりも整形してきれいに出力してくれるpはオブジェクトをStringではなくinspectに変換している
配列で元の大きい添字を指定すると間の値はnilで埋められるa=[1,2,3] a[4]=50などとすると[1,2,3,nil,50]となる
配列はa << 2 などで最後に要素を追加できるコードを見た覚えがある割には自分で使ったことはなかった
削除はdelete.at(n)で行うdelete(n)だとnに一致する要素がまとめて削除される
divmodというメソッドは商と余りを配列で返す 14.divmod(3)[4,2]になる delete_ifメソッドを使うとdo |x|で条件を別に記述できる
Rubyプログラマはfor文を使わない確かに例文でほとんど出てこないので気にかかっていたたまたまかと思いきや本当に使わないのか
配列の要素を順番に取り出す作業はeachメソッド要素をどう扱うかはブロックブロックの中身に書くコードの役割ごっちゃになっていたのでようやく納得した
変数名の重複により他のものが参照できなくなることをシャドーイングという
do endの代わりに{}でブロックをくくることもできる僕が最初にうまく理解できなかった理由はこれだな
.mapを使うとブロックの戻り値が配列の要素となる新しい配列が作成されるnew = numbers.map { |n| n * 10}で配列numbersを10倍にした新しい配列が作れる
112ページまで
## 3/17
numbers.select {|n| n.even?} : このようにselectメソッドを使うと条件を満たした配列のみを作成できるこの例では偶数のみの配列が生成される
numbers.find : findメソッドは戻り値が真になった最初の値のみを返す
numbers.sum : 名前通り配列の要素を合計できる文字列でも使える('')単純な連結ならjoinメソッドの方が楽だがsumは文字列の加工に優れる
&:メソッド名でシンプルに書けるブロックパラメータが1つブロックの中のメソッドに引数がないメソッドを1回呼び出す以外の処理がないといった条件をすべて満たすと [1,2,3,4,5,6].select{|n| n.odd?}[1,2,3,4,5,6,].select{&:odd?}のように簡潔に書ける演算子を使っている場合は不可能
(1..5)←これはRangeという名前のオブジェクトだったただのそういう感じの簡略記法かと思っていた点が三つだと5は含まれなくなる
(1..5).to_aで値が連続する配列を作ることができるこれ””””答え””””こういうものがあるといいと思ってた
RBG変換器の実装を通じてこれたぶんもっと短くなる方法ありそうだな……と思っていたらすぐ下でsumを使った記法が書かれていたぜひものにしたい
123ページまで
## 3/19
to_intsメソッドのリファクタリングを通じて空の配列を用意してほかの配列をループ処理した結果を空野妃紫配列に詰め込んでいくような処理の大半はmapメソッドに置き換えることができる……らしい
上級編に書かれていた多重代入scanメソッドmapメソッドを呼ぶからの&シンボエンドレスメソッドの流れはカードバトのフィニッシのコンボみがある
a.values_at(0,2,4)この形式で取得したい要素を複数指定できる
a[a.size - 1]この形式で最後の要素を取得できる
a[-1]これでもいける
a.lastこれもいける
a[開始地点,範囲] = 置き換える数字 で要素を置き換えられる
a.concat(b)でaを破壊的にbと結合するbは破壊されない
e, *f = 100,200,300*このような書き方をするとはみ出した数字を含めた配列がfに代入される
e, * = 100,200,300 この場合は100のみがeに格納されて他は無視される
e, = 100,200,300 これも同じ
a, *b, c, d = 1,2,3,4,5* この場合は間に挟まれた残りの要素がbに入る2,3
配列を配列にpushで代入する場合スプラット演算子をつけなければ多重配列になる
上記の特性を活かしてwhen節で配列を複数の条件として展開できる
上記の特性を活かして簡潔な形で配列を連結させることもできる[-1, 0, *a, 4, 5]
%w記法:これはフォーマッタが教えてくれた。%W大文字を使うとタブ文字なども使える
'Ruby'.chars この形式で文字を一文字ずつ分解して配列にできる
'Ruby,Java,Python'.split(',') 文字列から配列を作る
a = Array.new(5, 0) 配列に初期値を設定して作る方法この例では5つの0が配列に入る
a = Array.new(10) {|n| n % 3 + 1} ブロックを使った初期値の設定例引数の数だけ呼ばれてブロックの中身が要素の添字になる
第2引数デフォルト値を指定するとすべての配列が同じ文字列オブジェクトを参照するため破壊的メソッドですべてが置き換わる
ミュータブルとイミュータブルイミュータブルなオブジェクトは破壊的変更の影響を受けない主に数値シンボル真偽値nilRangeはイミュータブル
freezeメソッドを使うとイミュータブルなオブジェクトにすることができる
with_indexはeach以外でも使えるmapやdelete_ifなど : Enumeratorクラスに属するものはwith_indexを呼び出せる
配列の要素分だけブロックパラメータを用意すると各要素の値が別々の変数に格納される
ブロックパラメータを丸括弧で囲うとwith_indexなどで他のブロックが必要になる場合でも上記の挙動を実現できる
番号指定パラメータ_1 このような形式でブロックに格納する変数を指定できる
do..endの代わりに使う{}は結合度が高い異なった解釈をする場合があるのでブロックに丸括弧が必須
しかしながらdo..endと{}は基本的には同じなのでendの後ろにドットをつけて.joinなどをつけても機能する
151ページまで