一週間のカリキュラム 1週間で、Ruby 〜 Ruby on Railsまでを学ぶ
シリーズの1日目、最後のRubyの基本的な文法について見ていきます。
1日目の内容
基本的な文法を把握する。
Ruby自体は文法が、かなり簡素な為わかりやすい言語です。 ただ、他の言語に比べた場合記号の使用などに置いては若干のクセがありますので、その部分を吸収すれば取得効率はかなり上がります。 それに合わせて、Ruby独自の機能や文法を抑える事が出来れば、第2言語としてのRubyは非常に扱いやすく書きやすい言語だと感じられると思います。
Rubyの言語は2系、3系での違いがあります。ここでは主に3系でのサンプルを掲載してます。
ネットで見つけたサンプルが動かない場合は使ってる言語バージョンの違いにも目を向けてみましょう。
最低限おさえるべき物
- 1 変数と定数
- 2 コメントと改行の意味
- 3 関数
- 4 標準出力
- 5 演算子
- 6 データ型
- 7 クラス
- 8 モジュール
- 9 制御文(条件分岐、繰り返し、例外処理)
- 10 組み込みオブジェクト
1 変数と定数
1-1 基本、英数字の集合体として変数が存在します。
例) message
message = "hello" # この#はコメントです。 これはローカル変数です。
puts message #メッセージを表示します。 > hello
puts message.length #文字の長さを表示します。 > 5
1-2 その変数の前に何らかの記号が付く事で、意味合いや影響範囲が変わります。
例えば $ が付く事でグローバル変数となります。
例) $message
その他に
$message #グローバル変数
@message #インスタンス変数
@@message #クラス変数
があります。
また、大文字で表記した場合は定数になります。
MESSAGE #定数
これらの変数の意味や影響範囲の違いは後述します。
2 コメントと改行の意味
さきほどの変数の所でもありましたが、#以降はコメントとなります。
#これはコメントです。
また、改行でプログラムの一区切りとなりますが、 ; 記号を入れて意図的に改行を指示する事も出来ます。
#通常の書き方
a = 1
b = 1
#こちらも意味は同じ
a = 1; b= 1
複数行のコメント =begin 〜 =end まで囲まれた行は全てコメントになります。
=begin
この部分は全て
コメント
に
なります。
=end
また、END と表記した場合、それ以降は全てコメントになります。
__END__
これ以降はどんだけ書いても
全てコメントに
なります。
3 関数
関数は一連の処理を行う、再利用可能な機能を提供します。
def greeting(v)
puts v
end
greeting("こんにちは")
greeting("こんばんわ")
def sum(a,b)
puts a + b
end
sum(1,2) # 1 + 2 の結果が表示される。
関数についてはクセポイントとして 参照
関数の呼び出し時にカッコをつけずに呼び出せるという仕様があります。
上記の sum(1,2) だと実際には
sum 1,2
で、呼び出し可能です。
また、ハッシュを利用した指定の場合の{}の省略の部分は今後のRailsの文法理解にも繋がりますので、是非確認しましょう。
#この形式は
func(a(),{a: => :b})
#この形式に変更が可能
func a,a: :b
4 標準入出力とデータ変換
入れてもらった数字2つを足して答えを出すプログラムで例を表します。
puts "1つ目の数字を入れてください。"
a = gets
puts "2つ目の数字を入れてください。"
b = gets
puts "1つ目と2つ目の数字を足した答えは"
puts a.to_i + b.to_i
``
.to_i は数字であることを期待してデータを数字に変換してます。
例えば.to_s とすると、逆に数字が文字列として扱われます。
```rb
a = 1 #数字として入力
b = "2" #文字として入力
puts a + b.to_i # 無事 1 + 2で解釈される。 3が出力される。
a = 1 #数字として入力
b = "2" #文字として入力
puts a.to_s + b # 文字として解釈されて 1 と 2がそのまま合わさって 12として出力される。
5 演算子
演算子の種類は多く、一気にやり始めるとキツイかもしれませんが、基本的には他のプログラム言語と同じなので最低限の物から覚える事で充分です。
#算術演算子
a + b # 足し算
a - b # 引き算
a * b # 掛け算
a / b # 割り算
a % b # aをbで割った余り
a ** 2 # aの2乗
a += 1 # aに1を足す
a -= 1 # aから1を引く
#代入演算子
a = b # aにbを代入
#比較演算子
a == b # aとbが等しい場合
a != b # aとbが等しく無い場合
a < b # aよりbが大きい場合
a > b # aよりbが小さい場合
#論理演算子
!a # aじゃない
#三項演算子
a = a ? b : c # aが真である場合はb,そうでない倍はc
他にも演算子は複数ありますが、参照 必要に応じて利用し覚えていけば良いでしょう
6 データ型
基本は 数字、文字、配列、ハッシュという形式です。
#数字
a = 1
puts a # 1
#文字
a = "あ"
puts a # あ ※文字
#配列
a = ["月","火"]
puts a[0] # 月
#ハッシュ
a = {name: "山田", sex: "男", age: 13}
puts a[:name] #山田
他の言語に似てる部分は多いのですが、ハッシュの値の取り出し方だけはコロンの 位置が変わる(コロンが前、後ろに用途によって移動します。)ので、その点だけ注意が必要です。 ※ :name のように、コロンがついてるデータ様式をシンボルと言います。 シンボルの用途や使う意味は 参照がわかりやすいです。 ※ 補足としてハッシュ式リテラル方式だと、PHPのオブジェクトのような表記も可能だが、その場合の取り出し方も異なります。
#ハッシュ式リテラル
a = {"name"=>"山田","age"=>13}
puts a["name"] #山田
7 クラス
プログラムをより再利用しやすい形にまとめたのがクラスです。 中に入れる値だけが変わる箱のようなイメージで結構です。
例えば 箱に「 プレゼントの箱 」という、名前をつけたい場合下記のように表現します。
# これはhako クラス
class Hako #1文字目を大文字に
def name #いわゆるgetter .nameで呼び出し
@name #インスタンス変数
end
def name=(name) #いわゆるsetter .name = ***で代入
@name = name
end
end
# このhakoに名前をつけてみる
a = Hako.new
a.name = "プレゼントの箱"
puts a.name # プレゼントの箱
ここで出てきたインスタンス変数 @name ですが クラスの外からは直接値を入れる事はできません。
しかし、上述の通りクラスの中ではそれぞれの関数から呼び出しが可能です。 その他にクラス変数というものがあります。
このインスタンス変数とクラス変数に関しては、他の言語に比べてクセがある部分です。 参照
8 モジュール
プログラムの数が多くなって、クラス名や関数名などがダブってしまうと、色々問題がおきます。 そのような事が起きないようにモジュールという名前空間を利用します。
module Ateam
def self.callteam #selfを入れる事でAteamモジュール自体の関数として設定
puts "A team"
end
end
def callteam
puts "B team"
end
puts Ateam::callteam # A team
puts callteam # B team
同じ callteamという関数を呼び出していますが、しっかり区別されてます。
9 制御文(条件分岐、繰り返し、例外処理、ブロック
9-1 条件分岐
IF文はさほどクセはありません。 ※ 他の言語との違いの注意点は 条件式が falseかnil以外は真になるという事ぐらいでしょうか
a = 5
if a > 4 then
puts "aは4よりも大きい"
end
9-2 繰り返し
10回繰り返す
#パターン1
10.times do |i| # iに 0〜9までが繰り返し代入される
puts i
end
#パターン2
0.upto(9) do |i| # iに 0〜9までが繰り返し代入される、数字を変えれば 1〜10とか11〜20とか
puts i
end
#パターン3
arr = [0,1,2,3,4,5,6,7,8,9,10]
arr.each do |i|
puts i
end
他にも色々パターンはありますが、とりあえずは、このぐらいを抑えておきましょう。
9-3 例外処理
begin
#例外の可能性のプログラム
a = gets
b = gets
puts a.to_i * b
# bが b.to_iで数字に変換されてないのでエラーに。
# puts a.to_i * b.to_i が正解
rescue
#例外が発生した場合
puts "例外が発生しました。"
else #このelseの部分は無くても本来OKです。
#例外が発生しない場合
puts "無事終了しました。"
end
本来はファイルやDBへの読み書きで利用します。
begin
File.open("test.txt",encoding:"utf-8") do |f|
print f.gets
end
rescue => e
warn "error #{e.class} / #{e.message}"
end
__END__
test.txtファイルが読み込めない場合↓のメッセージが表示されます。
error Errno::ENOENT / No such file or directory @ rb_sysopen - test.txt
10 組み込みライブラリとその他のライブラリ
以下の内容は確認だけしてください。
組み込みライブラリは、requireを使わなくても利用可能なライブラリ 一通りの処理が出来るようにライブラリが準備されてます。 組み込みライブラリ 参照
一方,その機能を使う時に必要な機能は requireをして読み込みをする必要があります。 その他ライブラリ 参照
他にもbundlerなどで他の人が作った便利なライブラリをgemとして利用する方法がありますが、その内容は2日目以降に確認していきます。