【2018年版】Macで学ぶ、Rubyの入門講座

こんにちは、サブローです。

Rubyを勉強したいけど、どのようにして学べばいいかわからない、という方へ。

今回は、Macを使って、プログラミング言語であるRubyを学んでいこう、ということで、Rubyの入門講座として、Rubyの基礎を一通り解説していきたいと思います。

この記事を書いている僕は、情報系の大学を修了し、プログラミングにおいては、ある程度学びましたが、Rubyに関しては、趣味程度でしか触っていないので、今回は、

をもとに、解説をしていきます。

もくじ

プログラミング言語Rubyとは
Rubyを書いて、実行してみよう
文字列オブジェクトとメソッド
日本語の表示について
数値と四則演算
変数の使い方
条件分岐 -if then end- について
繰り返し -whileとtimes- について
配列(array)の使い方
ハッシュ(Hash)について
ハッシュを作ってみよう
正規表現について
コマンドラインからの入力
ファイルからの読み込み
メソッドの作成と別ファイルの読み込み

プログラミング言語Rubyとは

プログラミング言語であるRubyとは、どのような言語なのでしょうか。

Rubyはオブジェクト指向言語です

すべてのデータは一貫してオブジェクトとして表現されているので、考えたことを素直に記述できるようになっています。

たのしいRuby第5版 [ 高橋征義 ]より

いきなり、オブジェクト指向と言われても、戸惑う方が多いかもしれません。

オブジェクト指向は、プログラミングにおける概念の1つなので、プログラミングをやっていく上で、徐々に捉えていくしかないものではあるので、ここでは簡単に説明すると、

オブジェクト指向とは、プログラムを「モノ」として捉えることです。

たとえば、車というオブジェクトを作成した場合、そのオブジェクトには、メーカー、車種、色といった情報を持つということだけを記述しておいて、

車を10台、登場させようという時に、マツダのアクセラで固定して、あとは色だけ10色かえて使おうといった感じです。

それぞれの車を別々に記述するのではなく、固定できるところは固定をして、コピーして使おうといった感じですね。

利点はいろいろとあるのですが、これだけの説明で、少なくともプログラムの記述量が減る、ということは分かると思います。

次の説明も引用するところから、

Rubyはスクリプト言語です

CやJavaのような言語で書かれたプログラムを実行するには、そのプログラムのソースコードを機械命令に翻訳する「コンパイル」という作業が必要になります。スクリプト言語の場合、書いたソースコードはコンパイルする必要がありません。そのまま実行できます。

たのしいRuby第5版 [ 高橋征義 ]より

これはあまり説明するところはないのですが、Rubyはコンパイルをする必要がありません。

Cのように、コンパイルして実行ファイルを作成し、実行するという手順はなく、

ruby print.rb

といった感じで、実行できます。

Rubyを書いて、実行してみよう

ここでは、Rubyを実行する方法としてもっとも一般的な、rubyコマンドを用いて実行する方法を解説します。

まずは、ターミナルの画面に「Hell, World.」と表示させてみましょう。

Ruby intro execution1

emacsで、ファイル名をhelloworld.rbとし、ファイルを作成します。このとき、拡張子は「rb」として、Rubyのプロブラムということを認識させます。

プログラムは次の1行のみです。

print "Hello, World.\n"

拍子抜けかもしれませんが、これもちゃんとしたプログラムです。

なので、実行すると、ターミナル上に、「Hello, World.」と表示され、プログラムとして動いたことがわかると思います。

Ruby intro execution3

では、このプログラムを解説していきます。

まずは、カッコの中の”Hello, World \n”をみていきましょう。

カッコの中のプログラムは、Stringオブジェクト、文字列オブジェクト、または、単に文字列と呼ばれ、Rubyでは、文字列、数値、時刻など様々なデータがオブジェクトとして扱われます。

ちなみに、「\n」は、改行を表す文字です。これがないと、こうなります。

Ruby intro execution4

次に、「print」について、みていきましょう。

printのようなプログラムは、メソッドと呼ばれ、手続きを行うためのもので、数値を使って足し算や引き算をしたり、文字列を繋げたり、といったなんらかの処理を行うことができます。

printは、カッコの中の文字列をコンソールに表示する、というメソッドなので、「Hello, World.」という文字列をターミナル上に表示することができた、というわけです。

また、メソッドに渡す情報のことを「引数(ひきすう)」と呼び、このプログラムでの引数は、「”Hello, World \n”」ということになります。

文字列オブジェクトとメソッド

ここまでで、Rubyプログラムの実行の方法はわかったかと思いますが、ダブルクォートは表示されないの?、といった疑問があったり、メソッドについての説明がまだ足りていないので、もう少し詳しく解説します。

文字列オブジェクトについて

まずは、「” “」についてですが、「” “」は文字列の始まりと終わりを意味し、引数として与えても、ターミナルに表示されることはありません。

表示をさせるには、「\”」として、バックスラッシュをつけます。

print "Hello,\"World.\"\n"

例えば、こうすると、

Ruby intro execution5

こうなります。

さきほど、「\n」で改行を意味するといいましたが、文字列中の「\」は、続く文字に特別な意味を持たせる役割を持っています。なので、「\」を文字列として表示させたい場合は、「\\」として、バックスラッシュを2回つづけます。

続いて、「” “」(ダブルクォート)と「’ ‘」(シングルクォート)の違いにも触れておきます。

「’ ‘」もダブルクォートと同様に、文字列の始まりと終わりを意味しますが、上のプログラムを

print('Hello,\"World\".\n')

とすると、

Ruby intro execution7

となることから分かる通り、「’ ‘」の中の文字列は特殊な解釈をされることなく、そのまま表示されます。

メソッドについて

では、メソッドについて、詳しくみてきましょう。

Rubyのメソッドでは、()を省略することができます。

なので、さきほどのプログラムは、次のように書くことができます。

print "Hello, World.\n"

実行すると、同じ結果が得られます。以降、本記事では、()を省略して書きます。

さらに、メソッドは並べて書くこともでき、

print "Hello, "
print "World."
print "\n"

としても、同じ結果が得られます。

また、文字列を表示するメソッドには、「puts」、「p」があり、「puts」メソッドは、文字列の最後で必ず改行が入り、「p」メソッドは、文字列の最後で必ず改行が入り、かつ、文字列と数値を違った形で表示してくれます。

puts "Hello, World."
p "Hello, World."
p "100"
p 100

とすると、

Ruby intro execution8

となることから、「puts」は、「print」の必ず改行が入るバージョン、「p」は、文字列を「” “」で表示し、数値はそのままで表示するということが分かるかと思います。

日本語の表示について

四則演算に入る前に、一応、日本語を使う可能性を想定して、日本語の表示から解説をします。

まあ、あまり使うことはなさそうではありますが。

何も難しいことはなく、次のようなファイルを用意します。

print "今は昔、竹取の翁(おきな)といふ者有りけり。\n"

実行をしてみましょう。

Mac basic1

このように、しっかりと日本語が表示されたと思います。

ただ、文字コードの設定によっては、正しく表示されない場合がありますので、日本語を扱う際の注意点を書いていきます。

ソースコードの文字コードが指定されていない場合、

invalid multibyte char (UTF-8)

となります。

こういった場合、Rubyには、ソースコードにコメントを追加することによって、文字コードを指定できる「マジックコメント」というものがありあます。

なので、Windowsで一般的なShift_JISでソースコードを書いた場合は、

# encoding: Shift_JIS
print "今は昔、竹取の翁(おきな)といふ者有りけり。\n"

といったように、「# encoding: 」のあとに、文字コードを指定することができます。

数値と四則演算

ここでは、数値の表示、数値の計算について解説していきます。

数値の表示について

前回、文字列オブジェクトを説明しましたが、数値についても同様に、「数値オブジェクト」があります。

1

と書けば、「1」の値の整数オブジェクトになり、また、

3.1415

と書けば、「3.1415」の値の浮動小数点数オブジェクトになります。

数値を表示するには、文字列と同様にprintメソッドやputsメソッドを使うので、

puts 1

とすれば、

Mac basic2

となります。

四則演算について

ここでは、計算の基本である四則演算をやっていきましょう。

まず、プログラミングの世界で、四則演算は記号を用いて次のように表します。

  • 足し算 → +
  • 引き算 → –
  • 掛け算 → *
  • 割り算 → /

では、プログラムを次のように書きます。

puts 1+1
puts 1-1
puts 1*2
puts 4/2

実行結果は、このようになります。

Mac basic3

通常の計算と同じように、プログラミングにおいても、掛ける(*)と割る(/)は優先されるので、例えば次のようにすると、

puts 2+4*2
puts 2+4/2

このようになります。

Mac basic4

変数の使い方

ここでは、プログラミングにおいて、重要な要素である「変数」について書いていきます。

変数はオブジェクトに名前をつける、というイメージです。

もう少し言うと、これまでにでてきた、文字列や数値のオブジェクトに名前をつけることよって、そのオブジェクトを管理しやすくしよう、ということです。

ただの文字列や数字だけだと、プログラムが長くなるにつれて、どのような意味を持っているのかが、だんだんわからなくなってきます。

また、プログラムの中で、同じ数値が何度も使われており、一度にすべてを変更したい場合、消して入力するというのは、効率がよくありません。

そういった場合、変数に代入してある値を変えるだけで、すべての数値が新しく代入された数値となります。

では、「変数」に値を代入してみましょう。

alphabet = "abcde"
num = 10
age = 18
name = "Saburo"

puts alphabet
puts num
puts age
puts name

以上です。これだけで、変数の宣言と値の代入が終わりました。

また、Rubyのすごいところは、型の宣言がいらないところです。

C言語だと、整数や文字や浮動小数点数など、その変数がどの値なのかを一緒に宣言しなければならないのですが、

Rubyだと、それがいりません。自動で行ってくれます。

では、表示をさせてみましょう。

Ruby basic2 1

このように、変数に値が代入されていることがわかります。

変数の表示のさせ方には、他にも方法があり、

print "僕の名前は" , name , "です。\n"

と、カンマで区切ることもできますし、

puts "僕の名前は#{name}です。"

と、#{ }で変数を囲むことで表示することができます。

条件分岐 -if then end- について

条件によって、処理を分岐させるためには、if文を使います。ifの構文は、次にように書きます。

if 条件 then
    条件が成り立ったときに実行させたい処理
end

このように書いた場合、条件が「true」であれば、処理が実行され、「false」であれば何も実行されません。

「false」の場合に実行させたい処理がある場合は、次のように書きます。

if 条件 then
    条件が成り立ったときに実行させたい処理
else
    条件が成り立たなかったときに実行させたい処理
end

また、「then」は省略することができるので、もっとシンプルに書けます。

if 条件
    条件が成り立ったときに実行させたい処理
else
    条件が成り立たなかったときに実行させたい処理
end

続いて、条件の中身の書き方についてですが、数値の場合、等号や不等号を使います。

  • == → 左辺と右辺が同じ
  • != → 左辺と右辺が異なっている
  • > → 右辺よりも左辺の方が大きい
  • >= → 右辺が左辺以上の値
  • < → 左辺よりも右辺の方が大きい
  • <= → 左辺が右辺以上の値

これらは、文字列についても同様に使えて、イコールとノットイコールの場合は、わかるかと思いますが、不等号の場合は、文字コードの大小で判断されます。

では、条件を表示させてみましょう。

puts 1 == 1
puts 1 > 2
puts "a" != "a"
puts "a" < "b"
puts 1 <= 1

とすると、

Ruby basic2 2

こうなります。

ということで、ifの例文です。

a = 10
if a >= 5
    puts "greater"
else
    puts "smaller"
end

とすると、

Ruby basic2 3

この場合、「true」なので、このように表示されます。

繰り返し -whileとtimes- について

同じ処理を繰り返し行わせたい場合に、2つの方法を紹介します。

while文

同じ処理を繰り返し行わせる場合に一般的な構文が、while文で、次のように書きます。

while 繰り返しの条件 do
    繰り返し行わせたい処理
end

「do」は省略できるので、例文をこのように書くと、

i = 1
while i <= 5
    puts i
    i = i + 1
end

1から5までの数字が表示されます。

timesメソッド

繰り返しのもう1つの書き方として、「timesメソッド」があります。

繰り返しの回数が決まっている場合は、こちらを使います。なお、timesメソッドでは、「do」を省略することはできません。

書き方は、

回数.times do
    繰り返し行わせたい処理
end

のように書き、例文を次のように書くと、

10.times do
    puts "Hell, World."
end

世界に挨拶を10回することができます。

「timesメソッド」は、イテレータと呼ばれる、Rubyの特徴的なメソッドで、繰り返しを行うためのメソッドです。

イテレータは、このあとも度々でてくるので、言葉だけでも覚えておくようにしましょう。

配列(array)の使い方

では、配列の使い方について、解説していきます。

配列とは

配列は、複数のオブジェクトをまとめて管理できる、名前のついた箱、というイメージでOKです。

みなさんも引っ越しの際には、ダンボールに名前をつけて、それぞれわかりやすいように分けていれますよね。

そのような感じで、同じ種類のものは、配列に入れてしまって、わかりやすいように管理しよう、ということです。

また、配列のように、オブジェクトを格納するオブジェクトのことを、コンテナやコレクションと呼びます。

では、配列にオブジェクトをいれてみましょう。

myouji = ["佐藤" , "鈴木" , "高橋" , "田中"]

このように、myoujiという配列オブジェクトに、「"佐藤"」、「"鈴木"」、「"高橋"」、「"田中"」という、4つの文字列オブジェクトをいれてみました。

ちなみに、配列の中にいれるオブジェクト決まっていない場合は、

myouji = []

とすることで、空の配列オブジェクトをつくることができます。

次に、配列の中のオブジェクトを取り出してみましょう。

配列の中のオブジェクトには、位置を表すために、インデックスという数字が振られています。

インデックスは、0から始まり、要素を取り出すには、

print "最初の名前は" , myouji[0] , "です。\n"

のように、配列の名前[インデックス]で取り出します。

実行結果は、このようになります。

Ruby array1

配列には、複数の種類のオブジェクトを混ぜることができ、数値や文字列を同じ配列に入れることもできます。

また、配列の大きさは、自動的にかわるため、たとえば、

myouji[4] = "渡辺"

とるすと、インデックスが3までだったのが、4までとなります。

配列と繰り返し

配列の要素をすべて表示したいとか、配列の要素においてある条件に当てはまる要素に特定の処理をしたいときなど、配列の要素のすべてにアクセスする必要があります。

Rubyには、配列のすべての要素にアクセスするために、eachメソッドというイテレータがあります。

書き方は、

配列.each do |変数|
    繰り返したい処理
end

と書きます。

では、実際に書いてみましょう。

myouji = ["佐藤" , "鈴木" , "高橋" , "田中"]

myouji.each do |m|
    puts m
end

と書くと、このようになります。

Ruby array2

ハッシュ(Hash)について

配列に続き、ハッシュもよく使われるコンテナです。

ハッシュは、配列とほとんど同じです。配列は要素を取り出す時の「キー」として、インデックスという数字を使いましたが、

ハッシュでは要素を取り出す時に、「シンボル」か「文字列」を使う、という違いだけです。

要素との関連付けを強くし、より要素を取り出しやすくした、という感じですかね。

シンボルとは

先程でてきた、シンボルについての説明ですが、シンボルとは、文字列に似たオブジェクトで、「:」をつけて、次のように表現します。

symbol1 = :sym1
symbol2 = :sym2

シンボルは、理解をするのが難しいので、ここで、リファレンスより引用します。

Rubyの内部実装では、メソッド名や変数名、定数名、クラス名などの`名前'を整数で管理しています。これは名前を直接文字列として処理するよりも速度面で有利だからです。そしてその整数をRubyのコード上で表現したものがシンボルです。

シンボルは、ソース上では文字列のように見え、内部では整数として扱われる、両者を仲立ちするような存在です。

名前を管理するという役割上、シンボルと文字列は一対一に対応します。また、文字列と違い、immutable (変更不可)であり、同値ならば必ず同一です。

実用面では、シンボルは文字の意味を明確にします。`名前'を指し示す時など、 文字列そのものが必要なわけではない時に用います。

Ruby 2.5.0 リファレンスマニュアル より

つまり、シンボルは、文字列の皮を被った数値です。コード上では文字列として扱われますが、内部では数値として扱われます。数値として扱われるので、比較や検索に対して、速度面で有利です。

また、シンボル自体がデータを持つことはなく、あくまでもデータの名前として使います。

なので、ハッシュのキーとしての役割において、データである必要ないので、ハッシュのキーとしては、基本的に、文字列ではなくシンボルが使われます。

では、表示させてみましょう。

symbol = :sym

p symbol
p symbol.to_s
p "sym".to_sym

とすると、こうなります。

Ruby hash1

このように、「.to_s」で文字列に、「.to_sym」でシンボルに変換できます。

ハッシュを作ってみよう

ここでは、実際に、ハッシュの作り方法を解説していきます。

配列の作り方と似ていていますが、ハッシュでは、「[ ]」ではなく、「{ }」を使います。

また、ハッシュでは、オブジェクトを取り出すためのキーと、そのキーを対応させるオブジェクトを

キー => オブジェクト

の形式で指定します。

キーには、シンボル、文字列、数値が使われますが、ここでは、シンボルをキーとして使う場合のみを解説します。

ハッシュは、キーにシンボルを使うと、次にように書きます。

person1 = { :name => "佐藤" , :kana => "サトウ"}
person2 = { name: "佐藤" , kana: "サトウ"}

ハッシュは、このように書くことができ、person2のようにすると、もっとシンプルに書くことができます。

この場合は、「:」を後につけます。

取り出し方についても配列と似ていて、

ハッシュ名[キー]

のようにし、オブジェクトを格納する場合は、

ハッシュ名[キー] = 格納したいオブジェクト

とします。

繰り返しについても配列と同様に、eachメソッドを使いますが、ハッシュの場合は、キーとオブジェクトの組を取り出すことになります。

ハッシュの場合のeachメソッドは次のように書きます。

ハッシュ名.each do |キーの変数 , 値の変数|
    繰り返したい処理
end

では、使ってみましょう。

address = { name: "佐藤" , kana: "サトウ"}

address.each do |key , value|
    puts "#{key}: #{value}"
end

とすると、こうなります。

Ruby hash2

正規表現について

Rubyにおいて、文字列を処理する際に使うのが「正規表現」です。

正規表現を使うと、

  • 文字列とパターンの一致(マッチング)
  • パターンによる該当箇所の抜き出し

など、さまざまな文字列処理を手軽に行うことができます。

正規表現が手軽に扱えるという点は、Rubyは文字列処理に強い、と言われる由縁でもあり、とても重要な機能です。

「〇〇という文字列を含んだ行を表示したい」とか、「〇〇と△△の間の文字列を抜き出したい」など、特定の文字列に対する処理を行いたい場合があります。

たとえば、なにかのマニュアルがあった場合に、該当の項目に移動するため、「使い方」にマッチする行は何行目か、といった時に正規表現を使うことができます。

上ででてきた、特定の文字列をパターンといい、パターンに当てはまるかどうかを調べることをマッチング、パターンに当てはまることをマッチするといいます。

このような、パターンをプログラミングで表現するために使われるのが、「正規表現」です。

では、マッチングの方法を解説します。

マッチングは次のように行います。

/bcd/ =~ "abcde"

正規表現の最も簡単なパターンの書き方は、上のように

/パターン/

と、パターンを「//」で囲むだけです。

正規表現の表し方は、さまざまな文字列に対応するために、いろいろと複雑な部分もあるのですが、単純なパターンのみの場合、これだけで表現できます。

正規表現というと難しく感じるかもしれませんが、まずは、単純なパターンの使い方から覚えていきましょう。

正規表現と文字列のマッチングを行うためには、「=~」を使い、実際にマッチングを行うには、

/パターン/ =~ "文字列"

という書き方をします。

マッチした時は、マッチ部分の位置を返し、マッチしなかった時は、nil(ニル)を返します。また、先頭文字の位置は、0から始まります。

では、正規表現を使ってみましょう。

p /Ruby/ =~ "Ruby"
p /Ruby/ =~ "ruby"
p /Ruby/i =~ "ruby"
p /Ruby/ =~ "Diamond"

とすると、

Ruby regexp1

このようになり、後ろに「i」をつけると、大文字と小文字の区別をせずにマッチングが行われます。

コマンドラインからの入力

これまで、データを扱う場合は、ソースコードに直接書いていたため、データをかえるにはソースコードを書き換えるしかありませんでした。

これでは、実践的とは言えません。

そこで登場するのが、コマンドラインからデータを与えるという方法です。

コマンドラインからデータを入力として与えられれば、ソースコードを書き換える必要がなくなります。

では、コマンドラインからデータを入力として与える方法ですが、そのためには、「ARGV(アーグヴィ)」という配列を使います。

ARGVは、コマンドラインからスクリプトの引数として与えられた文字列を要素として持ちます。

コマンドラインから引数を与える場合は、空白で区切って入力をします。

puts "最初の引数: #{ARGV[0]}"
puts "2番目の引数: #{ARGV[1]}"
puts "3番目の引数: #{ARGV[2]}"

ファイル名をprint_argv.rbとして、

ruby print_argv.rb Ruby Diamond Sapphire

とすると、

Ruby fileio1

このように、コマンドラインからデータの入力ができます。

ファイルからの読み込み

プログラミングにおいては、ファイルの読み込みが必要不可欠です。

今回は、次のようなテキストファイルを用意して、ファイルの中身を表示するプログラムを書いてみましょう。

sample.txt
Hello, World. My name is Saburo.

ファイルの中身を表示するプログラムは、次のような流れになります。

  1. ファイルを開く
  2. ファイルのテキストデータを読み込む
  3. 読み込んだテキストデータを出力する
  4. ファイルを閉じる

この流れをプログラムにしてみます。

filename = ARGV[0]
file = File.open(filename)
text = file.read
puts text
file.close

1行目で、コマンドラインから与えられたファイル名を変数に代入し、2行目では、ファイルを開き、ファイルを読み込むためのオブジェクトを変数に代入しています。

3行目では、readメソッドを使ってファイルからデータを読み込み、4行目で表示させ、5行目でファイルを閉じています。

実行すると、このようになります。

Ruby fileio2

メソッドの作成と別ファイルの読み込み

プログラミングにおいては、プログラムの一部や自作メソッドを別のプログラムでも使いたい、ということが多いにあります。

というより、プログラミングでは、複数のファイルに分割されたプログラムを組み合わせて、1つのプログラムとするということがほとんどです。

このように、他のプログラムから読み込んで利用するためのプログラムをライブラリと呼び、ここでは、自作のメソッドを作り、そのライブラリを読み込む方法を解説します。

メソッドの作成

メソッドを作成する構文は、次のように書きます。

def メソッド名
    メソッドで実行したい処理
end

では次に、「Hello.」と表示させるメソッドを作って、実行してみましょう。

ファイル名は、hello.rbとします。

def hello
    puts "Hello."
end

hello()

「hello()」で、メソッドを呼び出しているので、

Ruby fileio3

このように、「Hello.」と表示されます。

メソッドを呼び出す時には引数を渡すこともできるので、「()」の中は空ですが、引数を持つメソッドの書き方は、次回以降のシリーズで解説します。

ライブラリを読み込む

では、上の「hello.rb」ファイルから、メソッドの呼び出しを取り除いたものを、ライブラリとして読み込んでみましょう。

def hello
    puts "Hello."
end

プログラムの中でライブラリを読み込むには、requireメソッド、または、require_relativeメソッドを使って、次のように書きます。

require 使いたいライブラリのファイル名
    または
require_relative 使いたいライブラリのファイル名

このとき、拡張子の「.rb」は省略できます。

2つの違いについてですが、requireメソッドは、既存のライブラリを読み込む時に使い、あらかじめ決められた場所からライブラリを探すのに対し、

require_rekativeメソッドは、実行するプログラムが置かれた場所を基準にしてライブラリを探します。

なので、今回は、require_relativeメソッドを使っていきます。

require_relative "hello"

hello()

とすると、「Hello.」と表示されます。

まとめ

これで、Rubyでプログラミングをするための基礎は、一通り解説しました。

ここまでで、ある程度はプログラミングというものが分かってもらえたかと思います。

次回は、中級編として、より深掘りをしていこうと思っています。

それではまた。

SNSでもご購読できます。

コメントを残す

*