読者です 読者をやめる 読者になる 読者になる

Blank?=False

「呉下の阿蒙にあらず」をモットーにしたITエンジニアの日々

基礎RubyOnRails Chapter2 Rubyの基礎

f:id:stonebeach-dakar:20160608212025j:plain

今回は、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++でいう関数)
defendで囲んだ領域がメソッドとみなされます。

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

継承を行う場合、 < で親クラスを宣言します。
RubyC++のような多重継承はできません。(その代わり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というものが有ります。
unlessif !....に相当するもので、条件が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に入ります。