Ruby 基礎1
この章では、Rubyの基礎的な文法を学んでいきます。
まだ自分のPCにRubyのセットアップをしていない人は こちら からセットアップを完了させてください。
Rubyファイルの作成
まず、Rubyのプログラムを記述するファイルを作る必要があります。
Rubyを書くファイルの名前は何でも良いですが、hello.rb
のようにファイル名の最後にrbという拡張子をつけるという決まりがあります。
ここでは、試しに自分のデスクトップにworking
ディレクトリを作成し、そこにruby_tutrial-1.rb
というファイルを作成してみましょう。
プログラムを書く
ファイルを無事作成し終わったら早速、プログラムを書いてみましょう。
先ほど作ったファイル内に以下のコードを書いてください。
puts "Hello World!"
ファイルに記入し終えたら早速ファイルを実行して見ましょう。 Macの人はターミナル、Windowsの人はコマンドプロンプトまたはPowerShell(以後総じて「ターミナル」と記載)を開いて、以下のコマンドを入力してください。
$ ruby ./Desktop/ruby_tutrial-1.rb
>> Hello World!
無事Hello World!
とターミナルに表示されればプログラムの実行は成功です。
今回使用した puts
というのはRubyのメソッドの1つで、直後に指定したオブジェクトを表示させることができます。
今回はputsのあとに”Hello World”という文字列を記入したため、 “Hello World”という文字列をputsメソッドを使ってターミナル上に表示させる、というプログラム という意味になりました。
Rubyのメソッドにはputs
以外にも多く存在しています。 この章では、便利なメソッドをいくつか紹介しますが全てのメソッドを紹介しきることはできないので是非自分で調べて使ってみましょう。
コメント
プログラム中にはコメントと呼ばれるメモのようなものを書くことができます。 コメントはプログラムの実行時に無視されるので何を書いても問題ありませんが、書いておくと次のような良いことがあります。
- 自分が後で読み返したときに内容を思い出せるようにコードに対するメモとして使う
- 自分の書いたコードを別の人に受け継ぐときに使う
- なぜこの書き方で自分は書いたのか伝える
- この先何をしようと思っていたか伝える
- エラーを分析するため特定のコードの箇所の実行を無効にする
それでは、早速先ほど作ったファイルにコメントを付け加えてみましょう。 ソースコード中の文字をコメントにすることをコメントアウトと言い、コメントアウトするにはコメントにしたい文字の先頭に#
を記述します。 コメントアウトしたい文字をドラッグしてから command
+/
を押すことでも可能です。
puts "Hello World!" # Hello World!と表示させる
# puts "Hello World" これは実行されない
# コメントアウトの例
# エラー処理を追加予定
# もっとよい書き方があったと思うが、時間の問題で修正はしていない
irb
さて、いよいよこれからRubyの基本的な文法について学んでいきますが、毎回ファイルの内容を変更するたびにターミナルからファイルを実行していては大変です。
そこでここではirb(Interactive Ruby) というターミナル上でRubyのプログラムを動かすことができる機能を利用します。
早速、irbを立ち上げましょう。
irbはRubyに最初から付属されている機能のため新しく何かをインストールする必要はありません。 Macの場合、ターミナルを立ち上げてirb
と入力し実行して下さい。
Windowsの場合、スタートメニューのRubyからInteractive Rubyを起動してください。
irbを起動したら、直接プログラムを入力してエンターキーを押すだけで実行してくれます。
irbを終了するには、irbを起動中に「exit」と入力しエンターキーを押します。 (exitと打っても終了できない場合は、endと打って実行してみてください)
irb(main):001:0> puts "Hello World!"
Hello World!
=> nil
irb(main):002:0> exit
$
このようにirbが使えていれば大丈夫です。
オブジェクト型について
Rubyで扱える全てのデータは、「オブジェクト」と呼ばれます。 オブジェクトにはそれぞれ型があり、オブジェクトの型によってコードの書き方に違いがあったり、別の型同士をそのまま扱おうとすると予期せぬエラーが出てしまうことがあるためオブジェクトの型には注意が必要です。
以下にRubyの代表的なオブジェクトを示します。
オブジェクト名 | 扱うもの | 例 |
---|---|---|
文字列オブジェクト | 文字 | Hello World!,こんにちは |
数値オブジェクト | 数値 | 1,15,100 |
時刻オブジェクト | 時間 | 2018-04-25 21:01:27 +0900 |
配列オブジェクト | 複数のデータ | [“りんご”,”オレンジ”,”卵”] |
文字列オブジェクト
文字列オブジェクトは、その名の通り文字を扱うオブジェクトのことです。 先ほど書いたHello World!
も文字列オブジェクトということになります。
'(シングルクォート)
または"(ダブルクォート)
で囲った文字列が 文字列オブジェクトになります。 '
と "
の違いですが、例えば文字列の途中で改行(\n)をしたいという場合、 '(シングルクォート)
で囲んでしまうと改行されず \n がそのまま文字として出力されてしまいます。
実際にirbで実行してみましょう。
# ダブル(シングル)クォートで囲っていないためエラーが出る
irb(main):001:0> puts Hello World!
NameError (uninitialized constant World)
# シングルクォート
irb(main):002:0> puts 'Hello World!'
Hello World!
=> nil
# ダブルクォート(結果は同じ)
irb(main):003:0> puts "Hello World!"
Hello World!
=> nil
# 改行表示されない
irb(main):004:0> puts 'Hello\nWorld'
Hello\nWorld
=> nil
# 改行表示される
irb(main):005:0> puts "Hello\nWorld"
Hello
World
=> nil
文字列を連結させる
文字列オブジェクトは、数式のようにお互いに連結させることもできます。 文字列オブジェクト同士を連結させるには、文字列オブジェクト同士を+(プラス)
で繋ぎます。
また、このときお互いにクォートの種類が異なっていても問題はありません。
irb(main):005:0> puts "Hello " + 'World'
Hello World
=> nil
数値オブジェクト
数値オブジェクトは、数値を表現するためのオブジェクトです。 文字列オブジェクトのように、"(ダブルクォテーション)
または'(シングルクォテーション)
で囲む必要はありません。
計算をする
Rubyで一般的な計算処理をする場合、以下の様な数式記号が使えます。
- +(足し算)
- -(引き算)
- *(かけ算)
- /(割り算)
- %(剰余)
- **(累乗)
これらの演算子を使用することで普通の算数の計算と同じようにRubyに計算を実行させることができます。 実際に扱ってみましょう。
# 足し算
irb(main):001:0> puts 100 + 200
300
=> nil
# 引き算
irb(main):002:0> 450 - 200
250
=> nil
# 掛け算
irb(main):003:0> 4 * 7
28
=> nil
# 割り算
irb(main):004:0> 28 / 4
7
=> nil
# 剰余
irb(main):005:0> puts 100 % 13
9
=> nil
# 累乗
irb(main):006:0> puts 5 ** 2
25
=> nil
比較する
数値オブジェクトは計算をするだけでなく、値同士の比較をすることもできます。
Rubyでは、以下の様な比較演算子が使えます。
- >(左の値はは右の値よりも大きいか)
- <(左の値は右の値よりも小さいか)
- >=(左の値は右の値以上か)
- <=(左の値は右の値以下か)
- ==(左の値と右の値は同じか)
- !=(左の値と右の値は違うか)
これらの比較演算子を使用することで左右の値を比較することができます。
比較演算子を使った場合の返り値は、式が正しければtrue、間違っていればfalseという結果になります。
実際に扱ってみましょう。
#30は20より大きいか?
irb(main):001:0> puts 30 > 20
true
=> nil
#30は20より小さいか?
irb(main):002:0> puts 30 < 20
false
=> nil
#2 × 5は10以上か?
irb(main):003:0> puts 2 * 5 >= 10
true
=> nil
#3 × 5は10以下か?
irb(main):004:0> puts 3 * 5 <= 10
false
=> nil
#45 / 5は20と等しいか?
irb(main):005:0> puts 40 / 5 == 20
false
=> nil
#40 % 15は20と等しくないか?
irb(main):005:0> puts 40 % 15 != 20
false
=> nil
式展開
式展開を使うと、数値オブジェクトの計算式は文字列の中に組み込むことができます。 文字列の中で計算式を使い、式によって得られる値を文字列として出力できる機能です。
式展開の書き方は文字列中で #{計算式} とするだけです。
irb(main):001:0> puts "5に10を足すと#{5+10}です"
5に10を足すと15です
=> nil
色々なメソッドを使ってみる
Rubyでは、オブジェクトごとにそれぞれ利用できるメソッドがあらかじめ定義されており、これらのメソッドを使うことでオブジェクトを自由に処理することが可能になります。
メソッドを利用するには、オブジェクトに対してメソッド名を.(ドット)
で繋ぎます。
ここでは、Rubyの代表的なメソッドをいくつか紹介します。
lengthメソッド
lengthメソッドは文字列の文字数を数えたり、配列の中にあるデータの数を数えたりするために使用するメソッドです。
# 文字列の文字数を返す
irb(main):001:0> puts "Hello World".length
11
=>nil
upcase / downcaseメソッド
文字列オブジェクトが持つメソッドには小文字を大文字に変更するupcaseメソッド
とdowncaseメソッド
があります。
# 小文字→大文字
irb(main):001:0> puts 'hello'.upcase
HELLO
=> nil
# 大文字→小文字
irb(main):002:0> puts 'HELLO'.upcase
hello
=> nil
sliceメソッド
sliceメソッドは文字列や配列の中にある要素のうち、指定した箇所のみを切り出すときに使用するメソッドです。
切り出す最初の位置を第一引数、切り出す文字数を第二引数に取ります。
# 最初のから3文字切り出す
irb(main):001:0> puts 'hello'.slice(0, 3)
hel
=> nil
第一引数は 0 番目(index 番号)から文字を切り出し、第二引数は第一引数から 3 文字切り出すという意味になります。
0 番目はhなので、そこから3 文字切り出すとhelという文字が出力されると思います。
to_sメソッド
to_sメソッドは数値オブジェクトのメソッドで、数値オブジェクトを文字列に変換してくれます。
例えば、数値オブジェクトと文字列オブジェクトをそのまま連結しようとすると、オブジェクトの型が違うため、エラーが発生してしまいます。 そこで、to_sメソッドを使い数値オブジェクトを文字列に変換することで、両者を連結することが可能になります。
# 文字列に変換されるか確認
irb(main):001:0> 20.to_s
=> "20"
# そのままでは連結ができない
irb(main):002:0> puts "私の年齢は" + 20 + "歳です"
TypeError (no implicit conversion of Integer into String)
# to_sメソッドを使うと連結ができる
irb(main):003:0> puts "私の年齢は" + 20.to_s + "歳です"
私の年齢は20歳です
=> nil
getsメソッド
getsメソッドはターミナル上でユーザーが入力した値を文字列オブジェクトとしてプログラムに渡すことができます。 getsメソッドは後述する変数や定数と組み合わせることでいろいろな場面で使うことができるので是非覚えておきましょう。
また、getsメソッドで入力された値には最後に改行(\n)が自動で入力されますが、.chomp
をつけることによって改行を解除してくれます。
# ユーザーから入力を待つ
irb(main):001:0> gets
Hello # ユーザーの入力
=> "Hello\n" #文字列として返される
# 改行を解除
irb(main):002:0> gets.chomp
Hello # ユーザーの入力
=> "Hello" #改行を解除してくれる
変数
同じオブジェクトをプログラム内で何度も繰り返し使いたい場合、毎回同じオブジェクトを作っていたら大変です。
Rubyのプログラム上では、オブジェクトに名前をつけることでその値を保存しておくことができます。
変数とは、そのようなオブジェクトの入れ物、またはオブジェクトを識別する名札のようなものです。
変数の定義
実際に変数は以下のように定義します。 (=
は変数名に対してオブジェクトの値を代入するという意味)
変数名 = 格納するオブジェクト
変数を定義する際のルールとしては以下のようなものがあります。
-
原則、小文字から始める
-
名前の1文字目でなければ大文字や数字、_(アンダーバー)を使ってもよい
-
名前にスペースが入ってはいけない
-
予約語(Rubyによって最初から用途を与えられた単語)と同一の名前は使ってはいけない
それでは、実際に変数を扱ってみましょう。
# 毎回同じオブジェクトをつくるのは大変
irb(main):001:0> puts "私の年齢は20歳です"
私の年齢は20歳です
=> nil
# 変数を定義
irb(main):002:0> my_age = "私の年齢は20歳です"
=> "私の年齢は20歳です"
# 変数の中身を表示
irb(main):003:0> puts my_age
私の年齢は20歳です
=> nil
また、1度オブジェクトを代入したあとの変数に、別のオブジェクトを再び代入することもできます。
プログラム中に何度でも変更可能であることも変数の特徴です。
# 半径10cmの円の面積と演習を求める式
irb(main):001:0> menseki = 10 ** 2 * 3.14
irb(main):002:0> ensyu = 10 * 2 * 3.14
例えば、上のコードでは半径を表す「10」が3回登場します。 もし、半径径を15に変更する場合、10と書いてある箇所をすべて訂正するのは大変ですし、訂正し忘れる可能性もあり危険です。
変数の再代入できる特徴は、こういった場合変数の値だけを変えるだけで済むようになりプログラムの修正を非常に簡単に安全にできることを可能にします。
# 変数の値を再代入
irb(main):0004:0> my_age = "私の年齢は30歳です"
=> "私の年齢は20歳です"
# 変数の中身が更新されている
irb(main):005:0> puts my_age
私の年齢は30歳です
=> nil
# 半径を変数に代入
irb(main):006:0> radius = 10
irb(main):007:0> menseki = radius ** 2 * 3.14
irb(main):008:0> ensyu = radius * 3.14
# 半径の値を修正
irb(main):009:0> radius = 15 # この変数の値だけ修正すれば良い
irb(main):010:0> menseki = radius ** 2 * 3.14
irb(main):011:0> ensyu = radius * 3.14
定数
オブジェクトを扱っていると、何度も使いまわしたいけど後から値が変わって欲しくない場合があり、そういうときには定数を使います。 定数は、基本的には変数と同じくオブジェクトを格納する入れ物ですが、変数とは違い一度オブジェクトを代入したら再代入することをしません。
変数を定義する際のルールとしては以下のようなものがあります。
- 名前の最初を大文字にする。
- 慣習としては、定数は名前をすべて英大文字にする
何度も使いまわしたいが、後から再代入しない(して欲しくない)値の例としてここでは円周率を取り上げてみます。
# 定数の定義(円周率)
irb(main):001:0> PI = 3.14
# 半径15cmの円の面積
irb(main):001:0> radius = 15
irb(main):002:0> menseki = radius ** 2 * PI
=> 805.5
# 再代入しようとすると警告が出る
irb(main):003:0> PI = 3.58
warning: already initialized constant PI
warning: previous definition of PI was here
変数/定数の結合(式展開の利用)
変数や定数は式展開を用いて、文字列オブジェクトと結合することも可能です。
getsメソッドと組み合わせることによって、ユーザーの入力した文字を結合させることもできます。
# 定数を定義
irb(main):001:0> NAME = "渡辺"
=>"渡辺"
# 変数を定義
irb(main):002:0> age = 20
=>20
# 文字列との結合
irb(main):003:0> puts "#{NAME}は#{age}歳です."
渡辺は20歳です.
=> nil
# getsメソッドで入力された値を変数に格納
irb(main):004:0> input_name = gets.chomp
渡辺
=> "渡辺"
irb(main):005:0> puts "あなたの名前は#{input_name}です"
あなたの名前は渡辺です
=> nil
メソッド(関数)を自分で定義する
さて本章では、Rubyにあらかじめ付属している様々なメソッドを紹介しましたが、Rubyではそのようなメソッドを自分で自由に新しく定義することができます。
メソッドを自分で定義することで、特定の処理をまとめたものを何度も繰り返し使うのが便利になります。
メソッドの定義
メソッドは次のように定義します。
def メソッド名
# ここに処理を記述する
end
メソッドは def で始まりend で必ず終了します。 定義したメソッドの実行は メソッド名()
で実行できます。
Helloという文字を出力するメソッドを定義して、後述する内容をこのメソッドに加えてしていきましょう。 (メソッドの扱いは複数行使うため、irbではなくRubyファイルに記入し実行するようにしてください)
# Helloと出力するprinterというメソッドを定義
def printer
puts 'Hello'
end
# printerメソッドの実行
printer()
上の内容のファイルを実行して、無事Hello
とターミナルに出力されればメソッドが正しく動いています。
引数
メソッドは引数というものを使用することができます。
メソッド名の後に ()
を記述し、その中に引数を定義することができます。
引数とはメソッド内で使える変数のようなもので、メソッドを呼び出すときにその引数に値を指定することができます。 引数は複数指定することができます。
def メソッド名(引数1, 引数2, 引数3, ...)
puts 引数1
puts 引数2
puts 引数3
end
このように ()
内に ,
区切りで引数を複数指定することで、その引数をメソッド内で puts の後に記述し引数を出力できるようにしています。
返り値
メソッドは処理の最後で値を返します。これを 返り値(または戻り値) と呼びます。 返り値はreturn文
で指定することができます。 返り値を明記することで、メソッド内で処理したどの部分を結果として取得したいのか指定することができます。 (Rubyではreturn文を指定しない場合、メソッドの内最後の値が評価されます)
早速色々なメソッドを定義して実行してみましょう。
# profile_printerメソッドの定義
def profile_printer(name, age, skill)
puts "私の名前は#{name}で、年齢は#{age}歳、扱えるスキルは#{skill}です"
end
# 引数をつけてメソッドの実行
profile_printer("渡辺","20","Ruby")
#mensekiメソッドの定義
def menseki_calculater(radius)
menseki = radius ** 2 * 3.14
puts "半径#{radius}cmの円の面積は#{menseki}㎠です"
end
# 引数をつけてメソッドの実行
menseki_calculater(20)
本章の内容はここまでです。
本章で学んだことを使って練習問題を解いてみましょう。
練習問題
-
1年は何時間か計算するプログラムを書いてください(irb内)
-
以下のプログラムを実行するとエラーが出てしまいます。メソッドを使って修正してください。(irb内)
irb(main):005:0> puts "I am " + 20 + " years old."
- 為替計算を行うメソッドをつくってください(ファイル内) - 日本円を引数に渡すとドル,ユーロ、ポンド単位に変換されてそれぞれ出力される - 1ドル100円,1ユーロ130円,1ポンド150円として計算
</pre>