基礎RubyOnRails Chapter2 Rubyの基礎
今回は、RubyOnRailsのお勉強をする前にまずはRubyの基礎を復習していきます。
去年、Ruby技術者試験 2.1 Silverを取ったのですが、もうけっこう忘れているなぁ、と気付かされました。
Rubyとは
Rubyは、日本人であるまつもとゆきひろ
(通称Matz)が開発した言語で、インタプリタ型の言語に分類されます。
(ただし、Ruby1.9から中間コードをビルドするようになったのでコンパイラとインタプリタの中間という感じ)
非常に練って開発されているため、Rubyで書いたコードはシンプルで読みやすい、と言われています。
Rubyの特徴
個人的にはですが、Rubyの特徴は以下の3つだと思います。
- 動的型付け
- 完全なオブジェクト指向
- ブロック
動的型付け
とは、各リテラルを見て言語が自動で型を付けてくれるものです。
逆に、C#等でint a=0
と型を宣言する必要がある言語を静的型付け言語
と言います。
完全なオブジェクト指向
というのはすべてオブジェクト
ということです。
Rubyでは、すべての型はもちろん、クラスもClass
というクラスのオブジェクトです。
これがC++言語であれば、型はあくまで型で、オブジェクトではありません。
ブロックというのは、{}で囲んだ中のコードのかたまりをメソッドに渡し、処理するという考え方です。
なかなか説明が難しい概念ですが、GoFのデザインパターンの1つ、storategy
パターンが簡単に使えるもの、というイメージです。
Rubyの構文
Rubyの基本的な構文について書いていきます。
変数
Rubyの基本的な変数宣言は、シンプルに変数名と初期値を書くだけ。
s="Foo"
これだけでsという変数ができてしまいます。
コレがVBAなら、
Dim s as integer s = "Foo"
と2行も書かないといけないし、構文も長くて面倒臭い。
これがRubyのエレガントさです。
ちなみに,rubyの変数名には制約があり、
- 半角英数字と_(アンダーバー)のみ
- 先頭はかならず半角アルファベット小文字
日本語は使えません。また、先頭に半角アルファベットの大文字を使うと定数とみなされます。
定数
定数は、かならず半角アルファベット大文字から始めます。
小文字から始めると、変数とみなされますので注意。
FOO = "bar"
メソッド
Rubyのメソッドは、必ずしもクラス内に書かないと行けないわけではなく、
クラス外の機能として宣言ができます。(C++でいう関数)
def
〜end
で囲んだ領域がメソッドとみなされます。
def foo puts "bar" end
また、引数有りのメソッドの場合、メソッド名の後に()を書き、引数となる変数名を書くことで実現できます。
ここでも型は必要ない!エレガント!
def foo(bar) puts bar end
そしてメソッドの戻り値は、メソッドで最後に評価された式の結果が戻り値になります。
def foo bar = "baz" end puts foo #=>"baz"
クラス
Rubyのクラス宣言は他の言語と同じような感じです。
制約として、先頭は必ず大文字となることに注意してください。
class Foo def bar puts "baz" end end Foo1 = Foo.new Foo.bar
継承を行う場合、 < で親クラスを宣言します。
RubyはC++のような多重継承
はできません。(その代わりMix_inという機能がある)
class Foo def bar puts "bar" end end class Baz < Foo def bar super puts "foobarbaz" end end
インスタンス変数
Rubyのクラス変数は、先頭に@をつけることでインスタンス変数とみなされます。
ちなみに、@@の場合クラス変数、$の場合グローバル変数となります。
class Foo def bar @baz = "foobarbaz" end end
アクセサメソッド
普段、インスタンス変数を外から利用するためにアクセサメソッドを作りますが、
Rubyの場合自動的にアクセサメソッドを作るメソッドが準備されています。
- attr_reader 読み込みのみ
- attr_writer 書き込みのみ
- attire_accessor 読み書き両方
class Foo attr_accessror :bar attr_reader :baz def Initialize @bar = "bar" @baz = "baz" end end Foo1 = Foo1.new puts foo1.bar #=>"bar" foo1.bar = "barbar" puts foo1.bar #=>"barbar" puts foo1.baz #=>"baz" foo1.baz = "bazbaz" #=> NoMethodError
例の場合、インスタンス変数bar
は読み書き両方、baz
は読み込みのみにしています。
bazに書き込もうとするとNoMethodErrorが発生します。
条件分岐
Rubyの条件分岐は一般的な言語にあるif
, Case
に加えてunless
というものが有ります。
unless
は if !....
に相当するもので、条件がFalse
であれば実行されるというものです。
一般的な構文は以下のものですが、
foo = "bar" if foo == "bar" baz = "baz" end
Rubyの場合このように後方に置くこともできます。
本書では、Rubyプログラマはこの書き方をすることが多い
と書かれています。
複数行あるより1行(ワンライナー)のほうがエレガントですものね!
foo = "bar' baz = "baz" if foo == "bar"
繰り返し
他の言語と同じ用に、RubyにもFor
,While
などの繰り返し処理文が存在します。
for num in 1..10 do puts num end #=> 1 #=> 2 <省略>
ただ、RubyOnRailsですとFor
,While
よりもeach
を使う機会が多そうです。
(1..10).each do |i| puts i end #=> 1 #=> 2 <省略>
Rubyのオブジェクト
配列
Rubyは配列もArray
オブジェクトとして作られています。
ary = [ "foo", "bar", "baz"] ary.each { |a| puts a } #=> "foo" #=> "bar" #=> "baz"
配列は、%記法
で宣言することもできます。
ary =%w( foo bar baz ) ary.each { |a| puts a } #=> "foo" #=> "bar" #=> "baz"
ハッシュ
ハッシュとは、perlのハッシュ
, C++のMFCにあるCMap
に同じようなもので、いわゆる連想配列
です。
キーと値のセットになっており、キーを使って値を取り出すという事ができます。
Railsでは様々なメソッドの引数にハッシュが使われており、シンボル
とあわせて使う機会が多いオブジェクトです。
ha = { foo: "A", bar : "B", baz: "C"} puts has[:foo] #=> "A"
また、メソッドの最後の引数になっている場合、{}を省略できます。
def area(bar) bar[:x] * baz[:y] end puts area({x: 10, y:20} ) #=>200 puts area( x:10, y:20 ) #=>200
Railsでは{}を省略することが多く、多くの参考書でも{}が省略されています。
そんな時は、コレはハッシュだな、と読んでください。
シンボル
シンボルとは、中身が整数になっている文字列です。これじゃさっぱりですね。
本書では「名前」を表すオブジェクトと紹介されています。アプリケーション内で特別な意味をもつ名前を表すのにシンボルをよく使います。
Railsではハッシュのキー、データベースのフィールド名等によくシンボルが使われます。
また、関係する他のオブジェクトでシンボルを生成し、そのオブジェクトに対しシンボルを渡すことでそのシンボルに対応した処理を行う、ということができます。
C++で言えば、列挙型
に近いイメージです。
以下の例では、find
メソッドの名前をシンボルとして、objクラスにfindメソッドがあるか?を見ています。
obj.find(1) if obj.respond_to?(:find)
範囲(Range)
繰り返しのところで出てきた、1..10
,これが範囲を表すオブジェクトです。
この場合、1〜10の範囲の整数という意味になります。
to_a
で配列にキャストして内容を表示すると、わかりやすいです。
rg = 1..10 puts rg #=>1..10 puts rg.to_a #=> 1,2,3,4,5,6,7,8,9,10
ちなみに、間の..
が...
になると挙動が変わり、1...10
であれば1以上10未満
という形になります。
rg = 1...10 puts rg #=>1...10 puts rg.to_a #=> 1,2,3,4,5,6,7,8,9
この範囲オブジェクトは、文字でも使うことができ、"a".."z"
であればa,b,c....x,y,zの文字になります。
rg = "a".."z" puts rg.to_a #=>a,b,c,d,e,f,g,h......v,w,x,y,z
漢字でもできます。(使うことは殆ど無いだろけど。。)
rg = "亜".."伊" puts rg.to_a #=>亜,亝,亞....伈,伉,伊
まとめ
ざっとRubyの基本について書いてみました。
Ruby技術者試験で勉強したことの振り返り的な内容になりましたが、こう見てみると、Rubyは本当によく考えられているなあと思います。
ソースコードも綺麗になるし、仕事もRubyなら良いのにな・・・と思ったり。
次からいよいよRailsに入ります。