Rubyはちょっとした処理をするのにも向いているプログラミング言語。その学習コストも低いので初学者や教育機関にもオススメ。
まずは端末を開く。
下記のようにRubyのバージョンを確認をしてみる。ruby
コマンドが使えないならRubyのインストールを。
ruby --version
ruby 2.0.0p598 (2014-11-13) [x86_64-linux]
CentOS7でRubyを実行・開発する環境は、ruby-devel
パッケージをインストールする。root権限で、
yum install ruby-devel
UbuntuでRubyを実行・開発する環境は、ruby
パッケージをインストールする。
sudo apt-get install ruby
プログラミングの作業は、「コーディング(コードを書く)→実行(プログラムを動かす)してみる」の繰り返し。
irb
コマンドで、ちょっとしたコードを入力の都度、実行。
ruby
コマンドで、予めコーディング完成したファイルを実行。基本的にこっち。
ruby ファイル.rb
下記1行だけのファイルも立派なプログラム。puts
メソッドを使って、「Hello, World!」と出力。
puts "Hello, world!"
ソースコードの中にプログラムの実行に関係しないコメントを残すことができる。
#
から行末まで=begin
と=end
で囲まれた複数行
# この行はコメント
puts "こんにちは" #から行末まではコメント、その前は実行される
=begin
この中もコメントなので下記は実行されない
puts "こんばんは"
=end
ruby
コマンドで実行する際、プログラムに情報を渡すことができる。これをコマンドライン引数という。引数が複数ならスペースを空けて、
ruby ファイル.rb "引数0" "引数1" …
そのコマンドライン引数はプログラム側では配列になっているので、次のようにインデックスは0から順番にARGV[0]
、ARGV[1]
…というようにして参照する。
puts ARGV[0]
puts ARGV[1]
何か処理したいときはメソッドを呼び出す。メソッドは自作できるが、基本的な機能ならば予め用意されている。
メソッドの呼び出しは下記のようにする。()
は省略できる。メソッドに渡す情報を引数という。引数が複数ある場合は,
で区切る。
メソッド名
メソッド名(引数)
メソッド名 引数
メソッド名 引数1, 引数2
メソッドは次のようにdef
とend
で囲って定義する。処理の部分はインデント(おススメは半角スペース2つ)すると見やすい。
def メソッド名(引数1, 引数2, …)
処理
end
# 定義
def hello
puts "こんにちは"
end
# 呼び出し
hello
puts
メソッドは文字列を出力する。
puts "Hello, world!"
引数が複数ならそれぞれ改行しながら出力となるので、下記は1行目に「Hello」、2行目に「world!」となる。
puts "Hello", "world!"
puts
と似ているが、print
メソッドは最後に改行しない。下記は1行で「HelloWorld!」と出力。
print "Hello"
print "World", "!"
文字列は"
か'
で囲む。"
(ダブルクォート)内では特殊文字を解釈するが、 '
(シングルクォート)内では\
と'
を除いて特殊文字を解釈しない。
例えば\n
は改行を意味する特殊文字であり、下記は1行目に「Hello」、改行して2行目に「world!」と出力。
puts "Hello\nworld!"
特殊文字の解釈をしたくない(エスケープという)場合、\
を直前に付ける。
改行がたくさんあるなど長い文字列は、ヒアドキュメントを使って変数に代入するとソースコードが見やすくなる。
変数 = <<-"EOB"
改行、
しまくりの、
文字列。
EOB
"
(ダブルクォート)で囲んだ文字列中に#{変数名}
という書式で変数を入れておくと、変数に代入されている文字列を結果として出力できる。これを展開という。
name = "アリス"
puts "こんにちは、#{name}さん"
上記は「こんにちは、アリスさん」と出力。
数値として処理する場合は"
や'
で囲まない。下記1行目は文字列になって「2 * 2」と出力だが、2行目は計算結果の「4」が出力される。
puts "2 * 2"
puts 2 * 2
掛け算は*
、割り算は/
、剰余は%
、べき乗は**
を使う。下記はすべて「2」と出力。
puts 1 + 1
puts 3 - 1
puts 1 * 2
puts 4 / 2
puts 5 % 3 # 5を3で割った余り
puts (10 ** 2) / 50 # 10の2乗を50で割る
メソッドはたくさんあり、自作もできるので名前が衝突することがある。そうなっても区別できる仕組みを名前空間といい、Rubyではモジュールがその役割。
各モジュールに色々なメソッドが含まれており、そのメソッドを呼び出すには、
モジュール名.メソッド名(引数)
例えば、数学に関するMath
モジュールには平方根を求めるsqrt
メソッドなどが含まれている。
Math.sqrt(100) # 100の平方根
名前の衝突がない場合、いったんモジュールをinclude
すれば、モジュール名を省略できる。
include モジュール名
include Math
# モジュール名省略
puts sqrt(100) # 10.0
プログラムは、他のファイルに書かれているプログラムも利用できる。特にそれを前提としたプログラムをライブラリという。
自作するライブラリの拡張子は.rb
にする。ライブラリの利用側はrequire
メソッドでファイル名を指定する。その際、拡張子.rb
は省略できる。
require "ファイル名"
例えば下記のようなライブラリを作り、
# ライブラリ.rb
def hello
puts "こんにちは"
end
それと同じディレクトリにプログラムを作る場合は、こうする。
# プログラム.rb
require "./ライブラリ" # 「./」は現在のディレクトリを指す
hello # こんにちは
文字列や数値など個々のデータをオブジェクトという。生成したオブジェクトを使い捨てにせず、後の方で再利用する場合には、そのオブジェクトに変数で名前を付けておく。これを「変数にオブジェクトを代入する」と表現する。
変数名 = オブジェクト
# 生成した数値オブジェクトをxという名前の変数に代入。
x = 10
# 変数を使うと何度も再利用できる
puts(x*x) # 100
条件式は、例えば二つのオブジェクトを比較するなどした結果、true
(比較が正しい)かfalse
(比較が間違っている)の値になる式。主にif
文やwhile
文など、条件を判断するときに使う。
数値や文字列が等しいか調べるのは==
、異なるかは!=
、数値の大小は>
(大なり)、>=
(以上)、<
(小なり)、<=
(未満)を使う。
2 == 2 # true
2 > 3 # false
複数の条件をまとめて一つの条件とする場合は、&&
(かつ)、||
(または)、()
(条件を括る)を使って条件式を追加していく。
# 条件式1がtrueのとき、または、条件式2と条件式3が両方trueのとき、全体がtrue
条件式1 || (条件式2 && 条件式3)
条件によって処理をしたり、しなかったりするには、if
文を使う。
if 条件式1 then
処理 # 条件式1がtrueなら実行し、if文から抜ける
elsif 条件式2 then
処理 # 条件式2がtrueなら実行し、if文から抜ける
else
処理 # どの条件式もfalseなら実行
end
何か処理を繰り返すなら、while
文やtimes
メソッド、each
メソッドを使う。
while 条件式1 do
処理
if 条件式2
next # 次の回の繰り返しへ(条件式1の判断へ)
end
if 条件式3
break # 繰り返し全体の終了
end
end
回数.times do |変数|
処理
end
配列は順番に並んだオブジェクトを入れるコンテナ(容器)。次のように[]
(角括弧)を用いて変数に代入する。配列に含まれている個々のオブジェクトを要素という。
変数 = [オブジェクト0, オブジェクト1, …]
配列に含まれている要素を参照するには、インデックス(要素の番号)を使う。一番目のインデックスは0となる。
配列名[インデックス]
配列の要素を順次処理していくにはeach
メソッドを使う。下記の変数には順番に配列の要素が代入されるので、処理中に参照できる。
配列名.each do |変数|
処理
end
ハッシュはユニークなキーが付いたオブジェクトを入れるコンテナ(容器)で、次のように{}
(波括弧)を用いて変数に代入する。
変数 = {キー1 => オブジェクト1, キー2 => オブジェクト2, …}
fruits = {"banana" => "バナナ", "apple" => "りんご", "orange" => "オレンジ"}
puts fruits["apple"] # りんご
キーをシンボルにしたハッシュの場合、シンボル名の末尾に:
を付けた次の書式も使える。
変数 = {シンボル名: オブジェクト, シンボル名: オブジェクト, …}
# どちらでもいい
fruits = {:banana => "バナナ", :apple => "りんご", :orange => "オレンジ"}
fruits = {banana: "バナナ", apple: "りんご", orange: "オレンジ"}
puts fruits[:apple] # [apple:]はダメ
乱数の生成ならrand
メソッド。引数に整数を入れると、0からその数未満の整数が得られる。
puts rand # 引数がない場合、0以上1未満の乱数
puts rand(10) # 0から9の整数の乱数
n = rand(10) + 1 # 1から10までの乱数
n.times do |i|
print "羊が", i+1, "匹…\n"
end
ファイル・ディレクトリの操作は、File
クラス、Dir
クラス、FileUtils
モジュールを使う。