週刊とっしーぱんち

昭和生まれのブロガーが綴る、全力脱力系雑記帳

Ruby Structの使い方を覚え始める。

f:id:osio-toshimasa:20210219004434p:plain:w320

おはよーございます。
忘れたころにやってくる、久々のプログラミング記事です。 前回プロレス団体のクラスを作ってみたので、今回はプロレスラーを表すクラスを作ってみました。

レスラーclassの定義

    class Wrestler
      attr_reader :profile, :unit, :ability, :skills

      # レスラーオブジェクトの初期化
      def initialize(profile, ability, skills)
        @profile = profile
        @ability = ability
        @skills = skills
        @unit = nil
      end

    end

名前や年齢などがprofile、レスラーの能力でability、プロレス技がskiilsという具合に定義してこれをレスラーのデータとして最初に入れとくイメージですね。ひとつだけ所属ユニットを表すunitを作ったものの、レスラーって最初からユニットの所属しているわけでもないような気がしていて、定義だけして何も入ってない状態です。このなんもないっていうのを表現するためにnilを入れてみることにしました。

Profileクラスの定義

今度はレスラークラスに入れ込むProfileの中身を定義してみることにしました。

     class Profile
       attr_reader :name, :birth_day, :gender, :weight, :height
    
       def initialize(name, birth_day, gender, weight, height)
         @name = name
         @birth_day = birth_day
         @gender = gender
         @weight = weight
         @height = height
       end
    
     end

最初はこんな感じでクラスとして定義してみたのですが、attr_readerに定義して、initalizeメソッドを作って、受け取るパラメータを書いて、そのパラメータを代入してってのが、なんかめんどくさく感じるようになってきました。で、調べてみるとどうやらStructを使うともっとスマートに書けそうだぞ、ってことでStructで書き直してみたのがこんな感じです。

    Profile = Struct.new(:name, :birth_day, :gender, :weight, :height)

めっちゃシンプル!かつ無駄がない!!
データの塊を表現する場合は、Structを使ったほうが記述もシンプルで追加や変更がしやすそうですね。実際にデータを入れ込むときはこんな感じで使います。

   Profile = Struct.new(:name, :birth_day, :gender, :weight, :height)
 
 profile = Profile.new('タイチ',
                                         DateTime.new(1980, 3, 19, 0, 0, 0),
                                         gender: 'male',
                                         height: 177,
                                         weight: 100)

次なる課題は・・

さりげなく推してる選手を入れていくスタイルです。Struct.newしたもProfileという変数を元にして、実際のオブジェクトを生成しているんだと思います。理解がただしければ。これでいろんなレスラーを作ることができるようになりました。今のところ、データを入れ込んでるだけのプログラムしか書いていないので、次回はもう少し動きのあるプログラムを書きたいなと思っています。
適当に妄想しながら作るのって楽しいなあ😄 では、また!