クモのようにコツコツと

フロントエンドエンジニア イイダリョウの技術ブログ。略称「クモコツ」

【Ruby】条件分岐、反復など(if、each)

Rubyの続きです。前回はクラスとオブジェクトを作成しました。今回はこのクラスを改造して、条件分岐、反復、配列などを使った処理を作ってみたいと思います。「20分ではじめるRuby」編は今回が完結になります!それではいきましょう!

【目次】

qiita.com

ソースコード

今回も「20分ではじめるRuby」を進めていく。今回で完結編!

前回のソースコードを元にさらに条件分岐、反復、配列などの処理が増えている。
※参考:20分ではじめるRuby

処理内容の詳細
※参考:20分ではじめるRuby


コードの内容は前回より処理内容が多く、入り組んでいる。

# クラス
class MegaGreeter
    attr_accessor :names

    def initialize(names = "皆さん")
      @names = names
    end

    def say_hi
      if @names.nil?
        puts "..."
      elsif @names.respond_to?("each")
        @names.each do |name|
          puts "こんにちは、#{name}!"
        end
      else
        puts "こんにちは、#{@names}!"
      end
    end

    def say_bye
      if @names.nil?
        puts "..."
      elsif @names.respond_to?("join")
        # 「、」で繋いで表示
        puts "さようなら、#{@names.join("")}。また会いましょう!"
      else
        puts "さようなら、#{@names}。また会いましょう!"
      end
    end
  end

  if __FILE__ == $0
    # オブジェクト
    mg = MegaGreeter.new
    mg.say_hi
    mg.say_bye

    # 単独(文字列)
    mg.names = "ジョン"
    mg.say_hi
    mg.say_bye

    # 複数(配列)
    mg.names = ["ポール", "ジョージ", "リンゴ", "スチュ", "ピート"]
    mg.say_hi
    mg.say_bye

    # 空
    mg.names = nil
    mg.say_hi
    mg.say_bye
  end

ソースコード
※参考:get-started-with-ruby-in-20-minutes/ri20min_10.rb at main · ryo-i/get-started-with-ruby-in-20-minutes · GitHub

namesとnames=を定義(インスタンス変数)

最初にインスタンス変数を定義する

    attr_accessor :names

    def initialize(names = "皆さん")
      @names = names
    end
  • attr_accessornamesメソッドとnames=メソッドを定義
  • initializeメソッドを作成(引数namesの初期値は「皆さん」 )
  • インスタンス変数@namesnamesを入れる

attr_accessorやインスタンス変数については前回記事を参照
※参考:【Ruby】クラスとオブジェクトを作成(class) - クモのようにコツコツと

say_hiメソッド(if、each、nil)

メソッドの内容を見ていく。最初はsay_hiメソッド。

    def say_hi
      if @names.nil?
        puts "..."
      elsif @names.respond_to?("each")
        @names.each do |name|
          puts "こんにちは、#{name}!"
        end
      else
        puts "こんにちは、#{@names}!"
      end
    end
  • 条件分岐はif文で、条件のカッコや処理のブロックはなくても良さそう
  • ifの条件:@namesが空nil
    処理:テキスト「…」を表示
  • elseifの条件:@nameseachメソッドで処理できるか(=配列か)
    処理:反復eachで配列の回数「こんにちは、xxxx!」を表示
  • else(その他)の処理:「こんにちは、xxxx!」を表示

Rubyの条件分岐if

  • ifelseifelseで分岐し、endで終わる

※参考:制御構造 (Ruby 3.3 リファレンスマニュアル)


nilは空(何も存在ない)を意味するようだ

(リファレンスだとちょっとわかりにくい)
※参考:Object#nil? (Ruby 3.3 リファレンスマニュアル)
※参考:class NilClass (Ruby 3.3 リファレンスマニュアル)
※参考:【Ruby】nilって何?判定方法と使い方を知ろう【初心者向け】 | ポテパンスタイル


respond_toは真偽チェック。前回記事参照
※参考:【Ruby】クラスとオブジェクトを作成(class) - クモのようにコツコツと


Rybyの反復eachメソッド

  • eachdoで始まりendで終わる
  • | |の中に配列を入れる

※参考:20分ではじめるRuby
※参考:Array#each (Ruby 3.3 リファレンスマニュアル)

Rubyにはfor文などもあるがeachの方がよく使われるようだ。


Rubyでfor文があまり使われない理由

これは動作しますが、あまりエレガントではありません。 iのような使い捨ての変数が必要ですし、そのリストがどのくらいの長さになるか 計算する必要がありますし、どのようにリストを走査するか説明する必要があります。

※参考:20分ではじめるRuby

say_byeメソッド(join)

次はsay_byeメソッド

  def say_bye
      if @names.nil?
        puts "..."
      elsif @names.respond_to?("join")
        # 「、」で繋いで表示
        puts "さようなら、#{@names.join("")}。また会いましょう!"
      else
        puts "さようなら、#{@names}。また会いましょう!"
      end
    end
  end
  • こちらもif文で条件分岐
  • ifは上のsay_hiメソッドと同じ内容
  • elseifの条件:@namesjoinメソッドで処理できるか(=配列か)
    処理:「さようなら、xxx、xxx、xxx。また会いましょう!」と表示
    joinメソッドによって配列の値を「、」で繋いでいる。
  • else(その他)の処理:「さようなら、xxx。また会いましょう!」を表示

joinメソッド

配列の要素を文字列 sep を間に挟んで連結した文字列を返します

※参考:Array#join (Ruby 3.3 リファレンスマニュアル)

mgオブジェクト作成と実行

次にmgオブジェクトの作成と実行をする

  if __FILE__ == $0
    # オブジェクト
    mg = MegaGreeter.new
    mg.say_hi
    mg.say_bye

    # 単独(文字列)
    mg.names = "ジョン"
    mg.say_hi
    mg.say_bye

    # 複数(配列)
    mg.names = ["ポール", "ジョージ", "リンゴ", "スチュ", "ピート"]
    mg.say_hi
    mg.say_bye

    # 空
    mg.names = nil
    mg.say_hi
    mg.say_bye
  end
  • 処理全体をif文で囲んでいる
    ifの条件:メインファイルとして実行されているならば
  • mgオブジェクトを作成(MegaGreeterクラスをnewで継承)
    mgsay_hiメソッドとsay_byeメソッドを実行
  • 次にmgnamesに単独の文字列「ジョン」を入れる
    mgsay_hiメソッドとsay_byeメソッドを実行
  • 次にmgnamesに配列(ポール、ジョージなど)を入れる
    mgsay_hiメソッドとsay_byeメソッドを実行
  • 最後にmgnamesnillで空にする
    mgsay_hiメソッドとsay_byeメソッドを実行

__FILE__は現在のファイル名を返す特別な変数です

※参考:20分ではじめるRuby
※参考:Kernel.#__dir__ (Ruby 3.3 リファレンスマニュアル)


$0はプログラムを実行するときに使われるファイル名です。

※参考:20分ではじめるRuby
※参考:$0 (Ruby 3.3 リファレンスマニュアル)

rubyコマンドの実行結果

rubyコマンドを実行してみた結果

% ruby ri20min_10.rb
こんにちは、皆さん!
さようなら、皆さん。また会いましょう!
こんにちは、ジョン!
さようなら、ジョン。また会いましょう!
こんにちは、ポール!
こんにちは、ジョージ!
こんにちは、リンゴ!
こんにちは、スチュ!
こんにちは、ピート!
さようなら、ポール、ジョージ、リンゴ、スチュ、ピート。また会いましょう!
...
...

おお、つらつらと挨拶テキストが表示されている!

  • say_hiメソッドとsay_byeメソッドが実行されて「こんにちは」「さようなら」の挨拶が表示される
  • 最初の挨拶は初期値「みなさん」
  • 次の挨拶は「ジョン」
  • 次の挨拶の「こんにちは」は配列の値で1人ずつ実行
    「さようなら」は全員まとめて1回で実行
  • 最後は挨拶をせず「…」で待機

意図通りの実行内容になっている♪
挨拶の名前が入れ替わり、単独の文字列にも配列にも対応した。空の時は沈黙の待機状態になった。

終わりに

ということで、今回は条件分岐や反復などの入り組んだ処理を体験できました。
やり始める前はコードをパッっと見では「行数が多いなぁ」という印象でしたが、これまでの短いコードの延長上にあり、どんな処理になるかもコマンド実行によって理解できました。
これで「20分ではじめるRuby」編は終了です!Rubyの基本的な読み書きはイメージできてきました。

次からはいよいよRuby on Rails編に突入!「Railsチュートリアル」に入っていきたく思います。
Webアプリのフレームワークなのでコマンド実行ではなくブラウザ上に表示するコンテンツになっていくと思います。それではまた!


qiita.com