Rubyの続きです。前回はクラスとオブジェクトを作成しました。今回はこのクラスを改造して、条件分岐、反復、配列などを使った処理を作ってみたいと思います。「20分ではじめるRuby」編は今回が完結になります!それではいきましょう!
【目次】
- ソースコード
- namesとnames=を定義(インスタンス変数)
- say_hiメソッド(if、each、nil)
- say_byeメソッド(join)
- mgオブジェクト作成と実行
- rubyコマンドの実行結果
- 終わりに
ソースコード
今回も「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
namesとnames=を定義(インスタンス変数)
最初にインスタンス変数を定義する
attr_accessor :names def initialize(names = "皆さん") @names = names end
attr_accessor
でnames
メソッドとnames=
メソッドを定義initialize
メソッドを作成(引数names
の初期値は「皆さん」 )- インスタンス変数
@names
にnames
を入れる
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
の条件:@names
がeach
メソッドで処理できるか(=配列か)
処理:反復each
で配列の回数「こんにちは、xxxx!」を表示else
(その他)の処理:「こんにちは、xxxx!」を表示
Rubyの条件分岐if
文
if
、elseif
、else
で分岐し、end
で終わる
※参考:制御構造 (Ruby 3.3 リファレンスマニュアル)
nil
は空(何も存在ない)を意味するようだ
(リファレンスだとちょっとわかりにくい)
※参考:Object#nil? (Ruby 3.3 リファレンスマニュアル)
※参考:class NilClass (Ruby 3.3 リファレンスマニュアル)
※参考:【Ruby】nilって何?判定方法と使い方を知ろう【初心者向け】 | ポテパンスタイル
respond_to
は真偽チェック。前回記事参照
※参考:【Ruby】クラスとオブジェクトを作成(class) - クモのようにコツコツと
Rybyの反復each
メソッド
each
はdo
で始まり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
の条件:@names
がjoin
メソッドで処理できるか(=配列か)
処理:「さようなら、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
で継承)
mg
でsay_hi
メソッドとsay_bye
メソッドを実行- 次に
mg
のnames
に単独の文字列「ジョン」を入れる
mg
でsay_hi
メソッドとsay_bye
メソッドを実行 - 次に
mg
のnames
に配列(ポール、ジョージなど)を入れる
mg
でsay_hi
メソッドとsay_bye
メソッドを実行 - 最後に
mg
のnames
をnill
で空にする
mg
でsay_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アプリのフレームワークなのでコマンド実行ではなくブラウザ上に表示するコンテンツになっていくと思います。それではまた!