プログラミング備忘録

プログラミングの学習状況をメモしています

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のデータとして扱えるのかを理解できるまでに時間を要した。

似たような形のコードを書く際は、真っ先にこのことを思い出したい。情けない。