This commit is contained in:
Rikuoh Tsujitani 2024-03-21 06:40:03 +09:00
parent 2fa39190d1
commit 77626d4ac9
Signed by: riq0h
GPG key ID: 010F09DEA298C717
3 changed files with 53 additions and 16 deletions

View file

@ -37,7 +37,7 @@ RBG変換器の実装を通じてこれたぶんもっと短くなる方法
123ページまで 123ページまで
## 3/19 ## 3/19
to_intsメソッドのリファクタリングを通じて空の配列を用意して、ほかの配列をループ処理した結果を空野妃紫配列に詰め込んでいくような処理の大半はmapメソッドに置き換えることができる……らしい to_intsメソッドのリファクタリングを通じて空の配列を用意して、ほかの配列をループ処理した結果を空配列に詰め込んでいくような処理の大半はmapメソッドに置き換えることができる……らしい
上級編に書かれていた多重代入➜scanメソッド➜mapメソッドを呼ぶからの&シンボ➜エンドレスメソッドの流れはカードバトのフィニッシのコンボみがある 上級編に書かれていた多重代入➜scanメソッド➜mapメソッドを呼ぶからの&シンボ➜エンドレスメソッドの流れはカードバトのフィニッシのコンボみがある
a.values_at(0,2,4)この形式で取得したい要素を複数指定できる。 a.values_at(0,2,4)この形式で取得したい要素を複数指定できる。
a[a.size - 1]この形式で最後の要素を取得できる a[a.size - 1]この形式で最後の要素を取得できる
@ -45,10 +45,10 @@ a[-1]これでもいける
a.lastこれもいける a.lastこれもいける
a[開始地点,範囲] = 置き換える数字 で要素を置き換えられる a[開始地点,範囲] = 置き換える数字 で要素を置き換えられる
a.concat(b)でaを破壊的にbと結合するbは破壊されない a.concat(b)でaを破壊的にbと結合するbは破壊されない
e, *f = 100,200,300*このような書き方をするとはみ出した数字を含めた配列がfに代入される e, *f = 100,200,300このような書き方をするとはみ出した数字を含めた配列がfに代入される
e, * = 100,200,300 この場合は100のみがeに格納されて他は無視される e, * = 100,200,300 この場合は100のみがeに格納されて他は無視される
e, = 100,200,300 これも同じ e, = 100,200,300 これも同じ
a, *b, c, d = 1,2,3,4,5* この場合は間に挟まれた残りの要素がbに入る2,3 a, *b, c, d = 1,2,3,4,5 この場合は間に挟まれた残りの要素がbに入る2,3
配列を配列にpushで代入する場合、スプラット演算子をつけなければ多重配列になる 配列を配列にpushで代入する場合、スプラット演算子をつけなければ多重配列になる
上記の特性を活かしてwhen節で配列を複数の条件として展開できる 上記の特性を活かしてwhen節で配列を複数の条件として展開できる
上記の特性を活かして簡潔な形で配列を連結させることもできる[-1, 0, *a, 4, 5] 上記の特性を活かして簡潔な形で配列を連結させることもできる[-1, 0, *a, 4, 5]
@ -68,6 +68,48 @@ do..endの代わりに使う{}は結合度が高い:異なった解釈をす
しかしながらdo..endと{}は基本的には同じなのでendの後ろにドットをつけて.joinなどをつけても機能する しかしながらdo..endと{}は基本的には同じなのでendの後ろにドットをつけて.joinなどをつけても機能する
151ページまで 151ページまで
## 3/20
始点を持たない範囲オブジェクト:(10..) これで10以上を表す。そんなことできるんだ。逆も可能 numbers[2..]などで3番目以降の要素を取得する
(nil..nil)で全範囲オブジェクトを作成可能
timesメソッド 5.times {|n| sum += n} などのように使う:知っているはずなのにこれまで使う機会がなかった
1ずつ増減させながら処理したい場合はupto/downtoメソッドが便利: 10upto(14) {|n| a << n} のような形式で1ずつ14まで増える配列が作れる
一定の数を増減させる場合はstepメソッドを使う : 1.step(10,2) {|n| a << n} これで2ずつ10未満まで増える
while文 while 真である条件 処理 endで書くRubyだと影が薄い気がする。逆バージョンのuntil文もある
for文 使わないけど一応ある: for n in numbers sum+= n endのように書く eachとの違いはローカル変数がforの外でも使えるところ
意図的に無限ループを作るloop do 処理 end
throwとcatch: これRubyでもあるんだ……と思っていたが他の言語のthrowとは意味が違っていた。breakの強化バージョンとして使う。catch :tag do ループ処理1 ループ処理2 throw :tag endで内側から一気に外側まで抜ける
breakとreturnの違いbreakは繰り返し処理からの脱出だが、returnはメソッドからの脱出になる
redo 繰り返し処理をやり直すRPGの質問みたいなことができる countで制限回数を指定できる
エイリアスメソッドがたくさんある理由:他の言語との整合性、直感性、あとからもっといい名前をつけた、英語との一体感
ここから第五章
ハッシュとはキーと値の組み合わせでデータを管理するオブジェクト:他の言語では連想配列やディクショナリ、マップと呼ばれている
{ キー1 => 値1, キー2 => 値2}
ハッシュリテラルとブロックの見分け方:ロケットでキーと値が区切られている(ハッシュ)、ブロックパラメータがある(ブロック)、処理が書かれている(ブロック)
ハッシュの利点:大量の値が格納されていても指定したキーに対応する値を高速に取り出せる
ハッシュの比較並び順が違っていてもキーと値の対応が同じであればtrue
ハッシュのeachメソッドブロックパラメータを1つにするとキーと値が配列に順番に格納される
シンボル:他の言語ではあまり見られない特徴らしい。コロンの後に続いて文字列を書くとシンボルリテラルを作ることができる。
シンボルの利点:文字列をよく似ているが整数として扱われるので文字列よりも高速に処理できる
シンボルの利点2同じシンボルは同じオブジェクトとして扱われる。なので大量の同じシンボルは文字列よりもメモリの効率に優れる。
シンボルの利点3シンボルはイミュータブルなオブジェクトなので破壊的変更ができない
シンボルの用途:ハッシュのキーに用いる。文字列よりも高速に値を取り出せる。キーは文字列である必要性がないのでよく使われる。
シンボルの用途2可読性の向上。特定の数値で任意の状態を表すと計算効率はいいが可読性が悪い。シンボルを使うと効率をあまり犠牲にせずに可読性を高められる
シンボルの利用でロケットを省略する:{japan => 'yen'}このように書くものを{japan: 'yen'}こうして書ける。圧倒的に記述量が減る。
両方ともシンボルにする: {japan: :yen} かなり使われているらしい
ハッシュのキーはそれぞれ別のデータ型でも問題ないが推奨はされない。一方で値の方はよく混在する(例:人物目録を作る際は名前が文字列、歳が数値、人間関係が配列、電話番号がハッシュなどになったりする)
キーワード引数buy_burger(menu, drink: true, potato: true) end シンボルと似たような形式で可読性の高い引数を設定できる
アスタリスク二個でハッシュの変数を指定すると中身をキーワード引数として利用できる
メソッド定義側のキーボード引数はシンボルっぽいだけであってシンボルではない:しかし呼び出す側はれっきとしたシンボルである(紛らわしすぎる)
ハッシュで使われるメソッド色々keysキーを配列として返す、valuesハッシュの値を配列として返す、has_key?(読んで字のごとく)
定義されていないキーワードを同時に受け取るにはアスタリスク2個の引数を最後に用意する
189ページまで

11
main.rb
View file

@ -1,9 +1,4 @@
def to_ints(hex) UNITS = { m: 1.0, ft: 3.28, in: 39.37 }
r = hex [1..2] def convert_length(length, from: :m, to: :m)
g = hex [3..4] (length / UNITS[from] * UNITS[to]).round(2)
b = hex [5..6]
ints = []
[r, g, b].map do |s|
s.hex
end
end end

View file

@ -1,10 +1,10 @@
require 'minitest/autorun' require 'minitest/autorun'
require_relative 'main' require_relative 'main'
class RdbTest < Minitest::Test class ConvertLengthTest < Minitest::Test
def test_to_ints def test_convert_length
assert_equal [0,0,0], to_ints('#000000') assert_equal 39.37, convert_length(1, from: :m, to: :in)
assert_equal [255,255,255], to_ints('#ffffff') assert_equal 0.38, convert_length(15, from: :in, to: :m)
assert_equal [4, 60, 120], to_ints('#043c78') assert_equal 10670.73, convert_length(35_000, from: :ft, to: :m)
end end
end end