34日目
今日の学習
Ruby
ToDoリストの作成
やんばるエキスパート教材 | ToDoリストプログラムを作ろう!
今日はこちらの課題に取り組んだ。
途中まではヒントを何とか辿りながら進められたが、途中でつまづいてしまう。
class Cat def initialize(name, id) @name = name @id = id end end cat = Cat.new("ねこ", 1) puts cat.name
このようなコードがあったとして、出力結果が「ねこ」であることを期待しているのに、undefined method 'name'
とエラーが返されてしまう。
すごく初歩的なところでつまづいているな...と思ったが、アクセサを完全に忘れていた。attr_reader :name
をつけて解決。
配列に要素があるかないかを判断して、if文を作成する時はany?
を使用した。
その後は、削除メソッドを追加するところでものすごく手間取ってしまった。
todo.delete(id: 1)
のような形で指示して、idが1のインスタンスを削除したいのだが、データが格納されている配列から、引数のデータをどうやって選別するのかが全く分からなかった。
taskはidとtitleとcontentの値を持ち、それらのデータが格納されている配列が@tasks
だとすると、
def delete(id:) task = @tasks.find { |task| task.id == id } if task @tasks.delete(task) puts "【削除】 [No.#{task.id}] #{task.title}:#{task.content}" else puts "データがありません" end end
このような形で処理をすることができた。
find
メソッドを使用して、受け取った引数と同じidのものがあれば削除する、ない場合はデータがないと伝える。
【Ruby入門】findメソッドの使い方をわかりやすく解説! | 侍エンジニアブログ
あとは、引数でキーを受け取るというやり方を、initializeメソッドで散々やっていたにも関わらず、普通のメソッドで扱うときに「これってどうするんだっけ...」となっていたのが痛かった。
上のコードで行くとdelete(id:)
の部分だが、ここで受け取った数をどういう形にすればidのデータとして扱えるのかを理解できるまでに時間を要した。
似たような形のコードを書く際は、真っ先にこのことを思い出したい。情けない。