Rubyとは?いま熱いRuby言語を徹底解説!
- 更新日: 2017年3月9日
- 公開日: 2016年3月17日
- Rubyとは
- Rubyの使用例
- プログラミング言語はなぜ必要か
- Rubyの普及
- まずは動かしてみよう
- プログラムの解説
- 変数
- 変数とは
- 変数の書き方
- 変数の命名
- 変数の値を取り出す
- 「_」でつなぐスネークケース
- 変数の上書き
- 変数hpの値を160に上書き
- コメントとは
- コメントの書き方
- 変数にhp、mpの初期の値を代入
- 変数に格納された情報を出力する
- 文字列
- 変数にhp、mpの初期の値を代入
- 変数に格納された情報を出力する
- 文字列オブジェクトとは
- 色々な文字列メソッド
- 数値
- 制御構造
- 制御構造とは
- 条件判断 if
- unless文
- 繰り返し処理
- 繰り返しの制御
- 配列
- 配列オブジェクトとは
- 配列の書き方
- 配列の操作
- 配列の繰り返し処理
- nilについて
- ハッシュ
- ハッシュオブジェクトとは
- ハッシュの書き方
- ハッシュの性質
- ハッシュの操作
- クラス
- クラスとは
- オブジェクトの生成
- ライブラリ
- ライブラリとは
- 日付を扱うためのライブラリ
- 日付の計算
- 日付のフォーマットを変更する
- その他のライブラリ
Rubyとは
Ruby(ルビー)は、まつもとゆきひろ(通称Matz)氏により開発された、プログラミング言語です
世の中には200種類以上のプログラミング言語があると言われていますが、インターネットが広く普及して以降、Rubyの人気は徐々に上がってきており、プログラミング言語のシェア率で見てもベスト10に入っています。Webに向いているプログラミング言語の中ではTOP3に入る人気の言語で、世界中で多くの人が使用しているプログラミング言語になります。
参考:http://news.mynavi.jp/news/2015/12/07/247/
順位 | プログラミング言語 | インデックス値 | 推移 |
1 | Java | 20.973% | ↑ |
2 | C | 16.460% | ↓ |
3 | C++ | 5.943% | ↓ |
4 | Python | 4.429% | ↑ |
5 | C# | 4.114% | ↓ |
6 | PHP | 2.792% | ↑ |
7 | Visual Basic .NET | 2.390% | ↑ |
8 | JavaScript | 2.363% | ↓ |
9 | Perl | 2.209% | ↑ |
10 | Ruby | 2.061% | ↑ |
11 | Assembly language | 1.926% | ↑ |
12 | Visual Basic | 1.654% | ↓ |
13 | Delphi/Object Pascal | 1.639% | ↑ |
14 | Swift | 1.405% | ↑ |
15 | Objective-C | 1.357% | ↓ |
16 | MATLAB | 1.168% | ↑ |
17 | Pascal | 1.147% | ↓ |
18 | R | 1.122% | ↓ |
19 | PL/SQL | 1.103% | ↓ |
20 | COBOL | 0.828% | ↑ |
Rubyの使用例
Rubyは様々な企業で利用しており、有名なところでcookpadやGitHub、SlideShareなどがRubyを使用しています。また弊社CodeCampでもRubyを利用してサービスを提供しています。
具体的にどのような場面でRubyを使用しているかというと例えばCodeCampの場合、
- ユーザー認証(ログイン)
- 名前やメールアドレスなど個人ごとに異なる情報の読み込みから表示
- レッスンの履歴の表示
など、様々なところでRubyを利用しています。
プログラミング言語はなぜ必要か
Rubyに限らず、Webページ作成の上でなぜプログラミング言語が必要かというと、プログラミング言語で表示する内容を「動的」に変えることにより、よりリッチなWebページ作成が可能となるためです。
例えばブラウザで「ページを表示した瞬間の時刻」をWebページに表示したいといった場合、時刻というのは常に変動している動的な値であり、HTMLで現在時刻を表現することはできません。
しかし、Rubyを代表としたプログラミング言語を利用すると、簡単に現在時刻を表示することができます。
Rubyの普及
プログラミング言語Rubyの利用、とりわけフレームワーク「RubyonRails」を利用したWeb開発はその開発効率の高さから、アメリカのシリコンバレーや日本のベンチャー企業を中心に急速に普及しています。
更にエンジニアの年収が高いアメリカではRubyonRailsエンジニアの平均年収が約1,300万円という高額な金額になっている事からもわかるように、企業からのRubyonRailsを利用しているエンジニアへの評価も高いフレームワークといえます。
米国における言語別の平均年収ランキング(QUARTZ調べ)
順位 | 言語 | 報酬 |
1 | Ruby on Rails | 10万9460ドル(約1290万円) |
2 | Objective C | 10万8225(約1270万円) |
3 | Python | 10万717ドル(約1180万円) |
4 | JAVA | 9万4908ドル(約1120万円) |
5 | C++ | 9万3502ドル(約1100万円) |
http://news.mynavi.jp/column/svalley/592/
まずは動かしてみよう
まずはRubyで文字を表示するプログラムを書いてみましょう。
cloud9からファイルを新規作成し下記の手本通りにプログラムを書いて保存しましょう。
[code title="hello.rb"]
print("Hello, Ruby")
[/code]
「rb」という拡張子はrubyのプログラムであることを表します。
ではファイル保存が完了したら、このRubyのプログラムをCloud9上で実行してみましょう。プログラムの実行にはCloud9のターミナル上でRubyコマンドを使います。
コマンド
[code gutter="false"]
$ ruby hello.rb
[/code]
本カリキュラムでは、コマンドを記載する際は$(ドル)を先頭に付加して記述するものとします。以降、$が付く行はコマンドと解釈して下さい。またスペースは全て半角スペースで入力していきます。
rubyのあとに半角スペースをあけ、実行するrubyプログラム名を指定します。
するとプログラムが実行され、今回作成したプログラムの実行結果として「Hello,Ruby」という文字が表示されるかと思います。
プログラムの解説
今回はほんの1行だけではありますが、これも立派なプログラムです。
実行することで「文字を表示する」という目的を果たします。
この1行のプログラムの中にもRubyを理解するための重要な要素を含んでいますので、順番に見ていきたいと思います。
・”Hello, Ruby”
まず”Hello, Ruby”という部分に注目します。今回プログラムを実行して表示された「Hello, Ruby」というテキストがダブルクォーテーションで囲われているのが分かるかと思います。これはほとんどのプログラミング言語で共通なのですが、シングル・ダブルクォーテーションで囲われたものは文字の羅列である「文字列」としてプログラムに解釈され、Rubyでは「文字列オブジェクト」と呼ばれます。同様に数値や、後述する配列といったもの等、Rubyではほとんどのすべてのものが「オブジェクト」として解釈されます。この”Hello, Ruby”も「文字列オブジェクト」という単位でRubyで扱われます。
・メソッド
今度は行頭のprintという部分を見てみましょう。このprintがメソッドと呼ばれるものになります。Excelを触ったことがある人は「SUM」や「Average」などの関数をイメージするとわかりやすいかもしれません。「引数(ひきすう)」と呼ばれる処理の対象である素材を受け取り、引数に対して関数独自の処理を実行しその結果を返してくれます。
例えばプログラムを書いている際に「数値」を使って足し算や掛け算をしたり「文字列」同士をつなげたり、「ある時刻」を基準にして、1時間後や1日後を求めたりといったような事はすべてこのメソッドを利用することで実現ができます。
このprintメソッドはprintの()カッコの中の内容(引数を)を表示する機能をもったRubyで用意されたメソッドになります。()の中のメソッドに渡す情報が引数(ひきすう)になります。
※オブジェクトの説明は後ほど行います。ここでは文字や数値などのデータとメソッドをセットで持っている”もの”という理解でいましょう。
※Rubyではメソッドの引数での括弧は省略することができますが、Rubyの教科書ではメソッドであることを明確にするために括弧を全て書いた形で進めていきます。
講師補足講師補足
オブジェクトにする意味
オブジェクトとしてデータを解釈させることで、Rubyで様々な機能を付加しています。例えば3.14という数値は単に3.14という値を表現するデータであるだけでなく、オブジェクトとして扱われることで、数値に関する切り上げ、切り捨て、四捨五入など様々な処理をメソッドとして併せ持つことができます。このメソッドがあることで開発者側で切り捨て、切り上、四捨五入などの計算ロジックを組まなくてもオブジェクトに紐付いているメソッドを呼び出すことで実現することができます。
・改行文字
さきほどのプログラムを実行すると画面上で改行されずに表示されました。これはprintメソッドが表示した文字の中に改行が無いためです。Rubyのプログラムで改行を入れるには3通りの方法があります。
・Ruby 改行方法 1つ目
print("hello, ruby ! ") |
というように改行を入れたい箇所で適宜プログラムを改行することで実現します。
ただこの書き方はプログラムが複雑になると読みにくくなってしまいます。
・Ruby 改行方法 2つ目
print("hello \n ruby \n") |
そこで2つ目の方法である改行を表す特殊な文字である「\n」を文章中に入れるのが好ましいとされています。こちらの方法では1行でプログラムを書き切ることができます。Windowsの場合「\」はフォントの仕様上「¥」で表示されます。MacのJISキーボード場合は「Option + ¥」でバックスラッシュが入力できます。
・Ruby 改行方法 3つ目
puts("Hello Ruby") |
3つ目の方法ですがputsというメソッドを利用します。こちらはprintメソッドと似ていますが、printメソッドと異なり、表示する文字の最後で必ず改行をしてくれます。printメソッドとは改行がつく/つかないで勝手が異なるので、場面に応じて使い分けていきます。
変数
変数とは
データを入れる箱のようなものです。この箱は様々な値の出し入れに使用します。
まずはお手本にある通り、変数を使ったプログラムを書いてみましょう。
[code title="variable.rb" highlight="4"]
hp=200
mp=80
puts("現在のhpは")
puts(hp)
puts("現在のmpは")
puts(mp)
puts("です")
[/code]
作成したプログラムのhpとmpが変数となります。
変数の書き方
Rubyにおける変数の書き方は以下となります。
- 名前に利用できるのは英数字か_(アンダースコア)で、数字が使えるのは2文字目以降
- hp → ○ hp1 → ○ 11 → × _hp → ○ _11 → ○
- 変数宣言及びデータ型宣言は必要ない ※宣言が必要な言語を学んでいた人用の説明
変数の命名
変数名は英単語を利用し、意味が分かる範囲で可能な限り短くしましょう。また英単語が複数となる場合、その区切りとして「(アンダースコア)」か「単語の始めのみ大文字」を利用するのが一般的です。
# 「」でつなぐスネークケース user_name user_name_other # 単語の始めのみ大文字、キャメルケース userName userNameOther |
一定の法則に従い分かりやすい変数名をつけることは、プログラムを書く上で非常に重要な要素になります。
変数の値を取り出す
変数に入れた値を利用する場合、変数をそのまま書くことで利用できます。
[code title="variable2.rb"]
# 「_」でつなぐスネークケース
puts("現在のhpは")
puts(hp) # 変数hpの値を取り出す
puts("です")
[/code]
もし変数をシングルクォートで囲んでしまうと、変数の値ではなく「hp」という文字が表示されてしまいます。
変数の上書き
変数は値は入れたあとでも、後で何度でも値を変更することが可能です。
[code title="variable3.rb"]
hp = 200
puts(hp)
# 変数hpの値を160に上書き
hp = 160
puts(hp)
[/code]
上記サンプルのように同じ変数に別な値を代入すると、代入された値が変数の値として上書きされます。
コメントとは
プログラムの中にはコメントを書くことができます。コメントはプログラム中に書かれていても直接プログラムとしては扱われません。
なぜコメントが必要かと思われるかもしれませんが、例えば一度書いたプログラムを誰か他のプログラマーが見ることもあります。その時
- プログラムの名前や作者、配布条件などの情報
- プログラムの説明
- プログラムの目印(あとで修正する箇所など)
- 複雑な処理の補足説明
というようなプログラムの情報を言葉で説明するためにコメントは存在します。
逆に複雑なロジックで組まれたプログラムにコメントも無い場合、初見のプログラマーからすれば、変数名やロジックなどから処理の内容を把握するしかないという状況に陥ります。そのため仮に自分しか見ないプログラムであっても何ヶ月後の自分がそのプログラムをみて把握できるか怪しいような箇所は積極的にコメントを付加していきましょう。
コメントの書き方
コメントを表す記号は「#」です。行頭に「#」があれば、行全体がコメントになります。行の途中に「#」があれば、「#」の部分から後ろの部分がコメントになります。
[code title="comment.rb"]
# 変数にhp、mpの初期の値を代入
hp=200
mp=80
# 変数に格納された情報を出力する
puts("現在のhpは")
puts(hp)
puts("現在のmpは")
puts(mp)
puts("です")
[/code]
変数に値を入れる前にコメントを付加します。プログラムの中のどこまで細かい情報をコメントで入れるようにするかは、作者や所属している会社のプログラミングのルールによって異なります。(全くコメントのないプログラムも存在します)
文字列
『セクション2のRubyプログラムを作成』の復習になりますが”Hello,Ruby”のようにシングルまたはダブルクォーテーションで囲まれた文字は「文字列オブジェクト」としてRubyに認識されます。
[code title="string.rb"]
# 変数にhp、mpの初期の値を代入
str1 = "俺は"
str2 = "海賊王になる!"
# 変数に格納された情報を出力する
puts(str1)
puts(str2)
[/code]
文字列オブジェクトとは
まずプログラミングでのオブジェクトというものは「データ」と「メソッド」がセットになっているものになります。
・データ
ここでの「データ」とは文字列オブジェクトであれば”Hello, Ruby”、”こんにちは”などの文字のデータである「文字列」のことになります。
・メソッド
メソッドは1章で出てきたものと同じですが、データを操作する処理がまとまったものになります。文字列オブジェクトのメソッドでは文字列に対する操作を行うものになります。
まとめますと、“Hello, Ruby”は文字列オブジェクトとなり、”Hello, Ruby”という文字のデータと、そのデータを操作するメソッドがセットになっているものとなります。この後、文字列オブジェクトで利用できるメソッドをいくつか見ていきますが、そのメソッドを使うことで
- 文字列の字数を数える
- 文字列の一部を削除する
- 文字列を連結する
などの文字列に対する操作が実現できます。
色々な文字列メソッド
文字列を操作するメソッドでよく使うものを見ていきます。文字列オブジェクトのメソッドを利用する際は下記のような形でオブジェクトのあとに「.」で繋ぎメソッド名を続けることで利用することができます。
"Hello, Ruby".メソッド名 |
以下のファイルを実際に作成し、実行結果を見ていきましょう。
・文字列の長さを得る length
[code title="string_length.rb"]
puts("こんにちは".length)
puts("hello".length)
[/code]
・文字列の連結 +
[code title="string_plus.rb"]
puts(“Hello” + “World”)
[/code]
Point 文字列の連結は2つ以上の文字列を連結することができます。
[code title="string_plus_plus.rb"]
puts(“Hello” + “World” + “!”)
[/code]
・文字の削除 delete ``` [code title="string_delete.rb"]
s = "a/b/c/d/e/f/g" puts(s.delete("/"))
[/code] ``` ・先頭と末尾にある空白文字をとる strip
[code title="string_strip.rb"]
puts(" Hello World ")
puts(" Hello World ".strip)
[/code]
・大文字にする upcase ``` [code tilte="string_upcase.rb"]
puts("hello world".upcase)
[/code] ```
・小文字にする downcase ``` [code title="string_downcase.rb"]
puts("HELLO WORLD".downcase)
[/code] ```
実際にプログラムを書く際には、変数に格納されている文字の体裁やフォーマットを整えて自分の好きな形にして表示をするというのが基本の流れになりますので、この章で出てきたメソッドや、その他この章では扱っていないメソッドもありますのでプログラムを書いている最中に文字列を「連結したい」「検索をしたい」「分割したい」「大文字にしたい」「切り取りたい」など操作を加えたい時にはRubyのリファレンスやWEB上で使い方を調べながら進めていきましょう。
(参考:http://ref.xaio.jp/ruby/classes/stringl)
数値
さきほど文字や数値などはオブジェクトとして表されると説明しましたが、文字列と同じく数値も「数値オブジェクト」として扱われます。
試しに以下のプログラムを作成し、実行してみましょう。
[code title="num.rb"]
puts(1)
puts(100)
puts(1+1)
puts(4-1)
[/code]
結果は数値の「1」「100」「2」「3」が表示されたかと思います。このように文字列と同じくputsで値を表示できますし、更に四則演算も行うことができます。
次に掛け算と割り算もやってみましょう。プログラミング言語の世界では掛け算を表す記号に「*(アスタリスク)」を、割り算を表す記号に「/(スラッシュ)」を利用します。以下のプログラムを作成し、実行してみましょう。
[code title="num2.rb"]
puts(2*2)
puts(2/2)
puts((1+1)*2)
[/code]
通常の四則演算と同じく括弧の中の計算から優先的に行われます。
最後に以下の例をみてみましょう。
[code title="num3.rb"]
puts(1+1)
puts("1"+"1")
[/code]
最初の方は数値オブジェクト同士の足し算のため、「2」が表示されますが、 最後の方は文字列オブジェクト同士の連結のため、「11」が表示されますのでご注意ください。
制御構造
制御構造とは
プログラミング言語には制御構造というものがあります。プログラミングの醍醐味でもあるのですが、プログラムの実行順序を変えたり、プログラムを繰り返し実行するような仕掛けとなります。
条件判断 if
ある条件によって挙動が変わるプログラムを作るにはif文を使います。WEB開発の現場では例えば
- スマホからのアクセスだけ◯◯の処理を行う
- 会員登録者のみ◯◯を行う
というような特定の条件下のみで実行したい(または実行したくない)処理がある場合にifが利用されます。
if文の構文は下記のようになります。
if 条件式 条件を満たす時に実行したい処理 end |
条件式には値が正しい(true)または正しくない(false)となる式を書きます。また、条件式に数値を利用する場合で大小関係を比較する場合は等号や不等号(<,>,>=,<=)を使います。
※等号といえば「=」を思い浮かべると思いますが、Rubyで「=」は代入を意味しますので、一致するかどうかを調べるには「==」を使います。
このように等号や不等号を使って得た結果はtrue/falseとなります。もちろんtrueはその条件が成り立っている場合で、falseは成り立っていない場合です。
Point true/falseについて
プログラムの中でtrue/false論理値と呼ばれるもので、真か偽かを表す特別な変数です。大まかに言うとtrueは「正しい」、falseは「正しくない」ということになります。if文はこのtrue/falseを使ってif文の判定を行い、プログラムの条件判断を行っています。
unless文
if文と反対の役割を表す条件判断の方法としてRubyではunless文というものがあります。
unless文の公文は下記のようになります。
unless 条件式 処理 end |
構文の形上はifとほぼ同じです。if文では条件式の部分がtrue(真)の場合、続く処理を実行していましたが、unless文では逆にfalse(偽)の場合に続く処理を実行します。
[code title="unless.rb"]
a = 10
b = 20
unless a > b
puts("aはbより大きくない")
end
[/code]
繰り返し処理
条件判断と並び、プログラミングの中で重要な要素として、繰り返し(ループ)というものがあります。プログラムと書いていると同じ処理を繰り返したいということが頻繁に起きます。
1つの例として1950年〜2016年の各年を出力する例を考えてみます。
puts(1950) puts(1951) puts(1952) ……………… # 数十回同じような処理が続く puts(2015) puts(2016) |
これを全てに書くとなると、とてつもない量の記述が必要になり、効率的ではありません。
これを繰り返しの1つの方法であるwhile文を使うことで数行の記述で同様の結果を得ることができます。
[code title="while.rb"]
year = 1950
while year <= 2016
puts(year)
year += 1
end
[/code]
実行結果からわかるように単純に数十個羅列した場合と同じ結果が得られました。ではどのような順番で処理が進んでいるのか詳しくみていきたいと思います。
・ループ1周目
year = 1950 while year <= 2016 # 1951 < 2016を比較し、trueとなるため処理続行 puts(year) year += 1 # 1951+1を実行し、1年加算する end |
・ループ2周目
year = 1950 while year <= 2016 # 1952 < 2016を比較し、trueとなるため処理続行 puts(year) year += 1 # 1952+1を実行し、1年加算する end |
・
・
・
・ループの最後
year = 1950 while year <= 2016 # 2016 < 2016を比較し、falseとなるため終了 puts(year) year += 1 end |
「条件式→繰り返し行う処理内容」
の順に実行されていき、条件式の結果がfalseとなると、while文が終了します。
重要なのは条件式で、while文の中に記載する、繰り返し行う処理内容は条件式がtrueとなった場合に実行されるため、ループ1回目の判定でfalseとなった場合、1度も実行されません。
i = 0 while i > 0 # この場合、(条件式がtrueにならないため)ここの処理内容は一度も実行されません end |
また、条件式がfalseとなるまでループが継続されるため、条件式によっては無限ループとなることがありますので、気をつけましょう。
i = 1 while i < 0 # 無限ループします end |
繰り返しの制御
繰り返しの途中で処理を中断したり、次の回に処理を飛ばしたいことがあります。Rubyには繰り返しを制御する命令があります。今回はその中でも代表的なbreakとnextを見ていきたいと思います。
・break
breakは繰り返し全体を中断します。実際の例をみていきます。
[code title="break.rb"]
year = 1950
while year <= 2016
puts(year)
year += 1
if year == 2000
break # 処理が中断
end
end
[/code]
while文でループの処理でyearが2016になるまで続いていきますが、if文で2000年になった場合にbreakが実行されます。breakが実行されるとそれまで続いていたループの処理が中断されます。
・next
nextは繰り返し中のnext以降の処理をスキップします。こちらも実際の例を見ていきます。
[code title="next.rb"]
year = 1950
while year <= 2016
if year == 2000
year += 1
next # 処理がスキップ
end
puts(year)
year += 1
end
[/code]
2000年になった場合にputsの処理が実行されていない(スキップされた)ことがわかるかと思います。
このようにbreakやnextはif文などと組み合わせてループの順番や処理にアレンジを加えるときに利用されます。
配列
配列オブジェクトとは
これまでの章で変数は値を入れる箱と例えましたが、配列オブジェクト(以下「配列」と呼びます)はその箱を複数集めた、大きな箱のようなものです。
まずはお手本にある通り、配列を使ったプログラムを書いてみましょう。
[code title="array.rb"]
classmates = ["鈴木", "佐藤", "斎藤", "伊藤", "杉内"]
puts(classmates[2])
[/code]
1行目に書いた5つの苗字のうち、斎藤が表示されます。
図で例えると、classmatesという大きい箱(配列)の中には箱が5つあり、それぞれの箱の名前と中身は、「箱0の中身が鈴木」「箱1の中身が佐藤」「箱2の中身が斎藤」「箱3の中身が伊藤」「箱4の中身が杉内」となっています。
このように、配列とは複数の箱と値を1つにまとめて扱うことができ、配列という大きな箱の中にある1つ1つの箱の名前のことを「インデックス」と呼びます。ここではインデックスは0、1、2、3、4のそれぞれの値につけられた名前の事を指します。また箱の中身である値とインデックスをセットで要素と呼びます。
大概のプログラミング言語では配列のインデックスは0から数え始めます。1から数え始めない事に違和感を覚える方もいるかもしれませんが、ここでは人間の年齢も生まれたときは0歳で、その後1年経つと1歳になるように、0から数え始める物だと理解しましょう。
Point 大概のプログラミング言語では配列のインデックスは0から数え始めます。1から数え始めない事に違和感を覚える方もいるかもしれませんが、ここでは人間の年齢も生まれたときは0歳で、その後1年経つと1歳になるように、0から数え始める物だと理解しましょう。
配列の書き方
Rubyにおける配列の書き方はいくつかあります
・[]を利用
[code title="array1.rb"]
classmates = ["鈴木", "佐藤", "斎藤", "伊藤", "杉内"]
puts(classmates[1])
[/code]
・インデックス名を指定して配列を定義
[code title="array2.rb"]
classmates = [] # 空の配列を作成
classmates[0] = "鈴木"
classmates[1] = "佐藤"
classmates[2] = "斎藤"
classmates[3] = "伊藤"
classmates[4] = "杉内"
puts(classmates[1])
[/code]
最初に空の配列を生成し、インデックスを指定してデータを1つずつ入れていくことで配列を定義することもできます。
・文字列オブジェクトのsplitメソッドを使う
[code title="array3.rb"]
str = "鈴木 佐藤 斎藤 伊藤 杉内"
classmates = str.split()
puts(classmates[1])
[/code]
カンマや空白など一定の法則で区切られた文字列から、文字列オブジェクトのsplitメソッドを使って、配列をつくることもできます。
配列の操作
配列の操作でよく使われるメソッドをとりあげていきます。ここで利用される方法はRubyのプログラミングでも多用されますので、全て覚える必要はないですがメソッド名の意味からどういう操作が行われるのかが、予想できると開発が楽になります。
・要素を加えるメソッド unshift
配列の先頭に新しい要素をつけくわえます。
[code title="array_unshift.rb"]
a = [1, 2, 3, 4]
a.unshift(0)
puts(a)
[/code]
・要素を加えるメソッド push
配列の末尾に要素をつけくわえます。
[code title="array_push.rb"]
a = [1,2,3,4,5]
a.push(0)
puts(a)
[/code]
・配列を連結する concat
配列に別の配列を連結します。
[code title="array_concat.rb"]
a = [1,2,3,4,5]
a.concat([6,7])
puts(a)
[/code]
・配列から要素を削除 delete
配列から指定した要素を取り除きます。
[code title="array_delete.rb"]
a = [1,2,3,4,5]
a.delete(2)
puts(a)
[/code]
この他にも配列を操作するメソッドは数多くあります。Rubyはあらかじめ便利なメソッドが用意されており、プログラミング中に場面場面で一番適したメソッドを選択することが重要になってきます。
メソッドをすべて覚えることは難しいかもしれませんが、自分で1から作成した処理が実はRubyであらかじめメソッドが用意されていてそれを利用すれば事足りる・・・ようなことは結構ありますので適宜インターネットやリファレンス(https://www.ruby-lang.org/ja/)を調べるなど状況に適したメソッドがないか調べる癖をつけましょう。
配列の繰り返し処理
セクション6の制御構文では、whileを使っての繰り返し(ループ)を見てきました。一方で配列の繰り返し処理ではeachメソッドを使った繰り返しがおこなえ、こちらの方が繰り返し処理を書きやすいという特徴があります。このeachメソッドを使って配列内の要素の合計値を計算するプログラムを見てみましょう。
[code title="sum.rb"]
list = [1,2,3,4,5]
sum = 0
list.each do |elem|
sum += elem
print elem
puts("を足します")
end
puts("合計は")
puts(sum)
puts("です")
[/code]
eachのあとのdo~endで囲まれた部分をブロックと呼びます。
ブロックにはいくつかの処理をまとめて書くことができます。今回は
sum += elem
puts(elem)
puts("を足します")
・1行目合計の値を格納する変数sumにelemを足します。
・2行目elemの値を出力
・3行目「を足します」を出力
という3つの処理をまとめて書いています。
またブロックの冒頭には|変数|という部分があります。今回変数はelemという名前にしています。この部分の変数名は任意で変更できます。
これはeachは配列から要素を一つずつ取り出し|変数|で指定された変数に代入してブロックの中の処理を繰り返し実行していきます。
今回のプログラムでは変数elemの値は以下のように繰り返しとともに変化していきます。
1回目→1(list配列の最初の要素の値)
2回目→2
3回目→3
4回目→4
5回目→5(list配列の最後の要素の値)
終了(list配列の最後の配列まで繰り返したため)
※|変数|のように||で囲むのはRubyのお作法です
nilについて
配列のデータを取り出す際にまだ存在していないインデックスを指定するとnil(ニル)というものが返されます。nilはオブジェクトが存在していないことを表す特別な値として覚えましょう。
[code title="nil.rb"]
classmates = ["鈴木", "佐藤", "斎藤", "伊藤", "杉内"]
puts(classmates[0])
puts(classmates[5])
[/code]
上記のプログラムを実行すると「0」というインデックスに紐付く値は存在しますが、「5」というインデックスに紐づく値がないため、この状態でnilというオブジェクトが返ってきていますが、nil自体は何も出力しないため結果的に何も表示されません。
ハッシュ
ハッシュオブジェクトとは
セクション7で学習した配列はインデックスを利用して、そのインデックスに対応する値を取り出したり、逆に与えたりすることができました。
ハッシュオブジェクト(以下「ハッシュ」と呼びます)は配列と同様にオブジェクトの集まりをまとめて表現するオブジェクトです。配列ではインデックスを用いて、各要素にアクセスしましたが、ハッシュでは「キー」というものを利用します。インデックスには数値しか利用できませんでしたが、キーにはどんなオブジェクトでも利用できます。このキーを利用して、配列同様、値を取り出したり、逆に与えたりします。
ハッシュの書き方
復習になりますが、配列の場合は[]を利用しました。
Rubyではハッシュの場合は{}を利用するルールとなっています。
[code title="hash.rb"]
classmates = {
"suzuki" =>"鈴木",
"satou" => "佐藤",
"saitou" => "斎藤",
"itou" => "伊藤",
"suguiti" => "杉内"
}
puts(classmates["suzuki"])
[/code]
配列の場合、書き方によってはキーを省略して0から順に割り当てるということが可能でした。しかしハッシュの場合は、どのような書き方でもキーと値をセットで書く必要があります。「=>」を挟み、左側が左側が「キー」で右側が「値」になります。
また、値の取り出し方も配列と変わらず、ハッシュ名とキーの指定により可能です。
ハッシュの性質
キーを自由に設定できますので、意味のある文字をキーとすることができます。例えば「アダ名」をハッシュでつけるプログラムを見てみます。
[code title="hash_nickname.rb"]
classmates = {
"ガリ勉" => "鈴木",
"委員長" => "佐藤",
"セレブ" => "斎藤",
"メガネ" => "伊藤",
"女神" => "杉内"
}
puts(classmates["ガリ勉"])
[/code]
このようにアダ名のような意味のある文字をキーとして値を設定することができます。配列とハッシュは似ているところもありますが、キーとなるものが数値のものは配列、文字やそれ以外のものをキーとするものがハッシュと覚えるようにしましょう。
また配列でもいくつかメソッドを見てきましたが、ハッシュにも専用のメソッドが用意されており、その種類や使い勝手の部分で配列とは異なります。
ハッシュの操作
配列と同様によく使われるメソッドをみていきましょう。
・ハッシュの要素の数を調べる size/length
[code title="hash_size.rb"]
h = {"green" => "キャベツ", "white" => "かぶ"}
puts(h.size)
puts(h.length)
[/code]
※size/lengthともに結果は同じです。
・キーと値を削除する delete
[code title="hash_delete.rb"]
h = {"R" => "Ruby"}
puts(h["R"])
h.delete("R")
puts(h["R"])
[/code]
・ハッシュがキーを持つか調べる key?
[code title="hash_key.rb"]
h = {"R" => "Ruby"}
puts(h.key?("R"))
puts(h.key?("Q"))
[/code]
・ハッシュに値があるか調べる value?
[code title="hash_value.rb"]
h = {"R" => "Ruby"}
puts(h.value?("Ruby"))
puts(h.value?("Rails"))
[/code]
クラス
クラスとは
オブジェクト指向の特徴である、クラスという概念について説明します。
これまで配列やハッシュについて学びましたが、これらの配列やハッシュは、実際は「Arrayクラスのオブジェクト」です。ダブルクォーテーションで囲った文字列と読んできたオブジェクトは、実はStringクラスのオブジェクトです。
このように表現すると若干分かりづらいかもしれませんが、クラスとは「雛形」を指します。
オブジェクトの生成
基本的に、オブジェクトを生成する際はnewメソッドを利用します。
例えば、下記のようにArray.newを使用してオブジェクトを生成します。
[code title="array_new.rb"]
array = Array.new
print(array)
[/code]
出力結果:[]
Point これまで文字列オブジェクトであれば”Hello, Ruby”のようにシングルクォーテーションやダブルクォーテーション、配列であれば[1, 2, 3]のように括弧をつかってオブジェクトを作ってきました。
これらはリテラルと呼ばれるもので、例えば配列を作る際にArray.newのように書くよりも[]と書くほうがタイプ数としては少なく同じ配列オブジェクト生成できます。このように基本となるStringやArrayなどのクラスであれば簡単に記述できる記法があらかじめ用意されていますのでそちらを使えば事足りますが、一方で9章で学ぶような「DateTimeクラス」などリテラルが用意されていないクラスからオブジェクトを作る際には上記のnewによる記法を利用することになります。
# 以下は実質同じ意味。②のほうがタイプ数は少なく生成することができる # newで生成 array1 = Array.new # ① # リテラルで生成 array2 = [] # ② # DateTimeはリテラルがないので、newを使う datetime = DateTime.new |
ライブラリ
ライブラリとは
これまで文字列や数値、配列などのオブジェクトやifやwhileなどの制御構造を学ぶ上で多くのプログラムを作成してきました。そのプログラムファイルにはそれぞれ「文字列を表示する」「足し算を行う」など何かしらの機能を持っています。
ライブラリとは同じように何らかの機能(特に汎用性の高いもの)を再利用可能な形でまとめたもので、後から呼び出して利用する用途で作られたプログラムになります。
例えば「時刻を簡単に扱うプログラム」「行列やベクトルなど数学的な計算を行うプログラム」「ファイルの読み込み/書き込みを扱うプログラム」など特定の機能を持ち、他のファイルから呼び出されて利用される事を前提にしたプログラムの事をライブラリと呼びます。
実際のプログラムを作成する際はRubyで用意されているライブラリや自作のライブラリなどを機械のパーツのように組み合わせて、一つのプロダクトを開発していきます。
では実際のライブラリを利用する例を見ていきましょう。
日付を扱うためのライブラリ
今回は日付をプログラム中で扱うDateのライブラリを見ていきます。プログラムの中でライブラリを読み込むには、requireメソッドを使用します。
・構文
require(使いたいライブラリ名)
requireメソッドが呼ばれるとRubyは引数で指定されたライブラリファイルを探して、そのファイルに書かれた内容を読み込みます。
[code title="date.rb"]
require("date")
days = Date.today
puts(days.to_s)
[/code]
・プログラムの説明
1行目でRuby付属のライブラリであるDateを読み込んでいます。するとDateオブジェクトを利用することが可能になります。ここではDateオブジェクトのtodayメソッドを使って「本日の日付情報」をもったDateオブジェクトを生成しています。
このDateオブジェクトにはいくつかメソッドがあります。その中の「to_s」メソッドを使うことで決まったフォーマットで日付情報を文字列で返してくれます。
[code title="date_to_s.rb"]
require("date")
d = Date.today
puts(d.to_s)
[/code]
またDateオブジェクトには以下のようにDateオブジェクトから、本日の「年」、「月」、「日付」などの情報を取得することができます。
[code title="y_m_d.rb"]
require("date")
d = Date.today
puts(d.year)
puts(d.month)
puts(d.day)
[/code]
日付の計算
基本的にはDateオブジェクトは日数単位での計算を行います。例を見ていきましょう。
[code title="calc_date.rb"]
require("date")
day = Date.today
puts(day + 1) # 明日の日付
puts(day + 100) # 100日後の日付
[/code]
日付のフォーマットを変更する
日付情報を文字として出力したい場合に、フォーマットを調整したいときがあります。
例えば2015年1月10日という日付でも
・2015/1/10
・2015年1月10日
・1/10
・1月10日
というような場合です。
これを実現するにはDateオブジェクトのstrftimeを利用します。このメソッドはフォーマット文字列という特殊な文字を引数にとります。そのフォーマット文字列に対応する出力形式が返ってきますので、このフォーマット文字列を組み合わせて自身が欲しい形式を指定する形になります。
[code title="format_date.rb"]
require("date")
t = Date.today
puts(t.strftime("%Y/%m/%d"))
[/code]
その他のライブラリ
日付を扱うライブラリであるDateを見てきましたが、Date以外にもRubyで用意されているライブラリは存在します。(参考:http://docs.ruby-lang.org/ja/2.0.0/library/ )
何かの機能を作成する際には、すでに同じような機能がRubyのライブラリで用意されていないか調べるようにしましょう。すでに用意されていればrequireの1行で利用することができ、効率的に開発することができます。
NEXT LESSON ☛ Railsとは?基礎から応用までがっつり解説!
目次 - Ruby & Ruby on Rails テキスト目次 -
- この記事を書いた人
- CodeCampus編集部