c,javaと比較しながらrubyに入門する話 - e-zuka rails拡大号vol1

37
Ruby入門

Upload: -

Post on 15-Jan-2017

321 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Ruby入門

Page 2: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

谷口耕平 @ran_tan

ハウインターナショナル でRuby on Railsを使って大学向けの教育サービスを作ってます。

自己紹介

Page 3: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

発表の内容• CやJavaと比較しながらRubyを紹介します。

• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。

• 最初にざっくりとRubyの特徴を説明します。

• 次にC、Javaと比較しながら基本的な構文を紹介します。

• 最後にRubyの書籍を紹介します。

Page 4: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

発表の内容• CやJavaと比較しながらRubyを紹介します。

• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。

• 最初にざっくりとRubyの特徴を説明します。

• 次にC、Javaと比較しながら基本的な構文を紹介します。

• 最後にRubyの書籍を紹介します。

Page 5: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

!Rubyとは?• 島根県松江市在住の まつもとゆきひろ さん

(通称 Matz)を中心に開発されているOSSのプログラミング言語

• Rubyは今年で23歳くらい

• 最新バージョンは v2.3.0

• 日本人のコミッターが多く、国内のRubyコミュニティは非常に活発。

Page 6: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Rubyを動かそう!• RubyInstallerを使う (僕が普段windows使ってないので、詳しいことはわかりません><)

• RubyInstaller http://rubyinstaller.org/ • 自分でビルドする場合は以下の電子書籍が参考になるらしい。

• Ruby環境構築講座 Windows編 http://tatsu-zine.com/books/winrubybuild

"

$

Windows

OS X

Linux

• 最初から入ってる。 • 本格的に使うなら rvm や rbenv の様な Ruby のバージョン管理ツールを使ってインストールするのがオススメ。複数バージョンの Ruby をインストールし、切り替え可能。 • 日本だと rbenv の方がよく使われている印象。僕も rbenv 使ってます。 • rbenv https://github.com/rbenv/rbenv • rvm https://rvm.io/

• OS X と同様に rbenv や rvm を使ってインストールするのがオススメ。

参考: Rubyist Magazine - Rubyの歩き方 http://magazine.rubyist.net/?FirstStepRuby

Page 7: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Rubyのここが好き

Rubyは楽しい!

Page 8: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Rubyは 「読みやすい」かつ 「書きやすい」ので 「作りたいものに集中出来る」そして、作る事は楽しい。 短く言うと「Rubyは楽しい」

Page 9: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

「Rubyは楽しい!」を支えるもの

• 全てが「オブジェクト」である

• 充実した組み込みライブラリ

• ブロック構文

• 黒魔術(メタプログラミング)

Page 10: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

全てが「オブジェクト」である

• 数値も文字列も配列もオブジェクトなので直感的なコードが書ける

10.times do puts 'Hello, World!'end

'Hello, World!'.upcase # => "HELLO, WORLD!"

# 1文字ずらすシーザー暗号の例'Hello, World!'.each_char.map {|c| c.next }.join# => Ifmmp-!Xpsme"

['Ruby', 'Matz', 'eZUKA Rails'].select do |i| i.include?('R')end# => ["Ruby", "eZUKA Rails"]

Page 11: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

充実した組み込みライブラリ• ドキュメント http://docs.ruby-lang.org/ja/

• 特に、String, Array, Hashなどよく使うクラスのメソッドが充実しているので、いろんな処理がさくっと書ける。

Page 12: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Rubyで使えるライブラリ

!Ruby

組み込みライブラリ 標準添付ライブラリ

Rubyをインストールすると入るもの

+ + RubyGems

OSSの gem を gem コマンドでインストール可能RubyGems.org には様々なライブラリ( gem )がある z

z

沢山ある

https://rubygems.org/ で探せる。https://www.ruby-toolbox.com/ で探すのもオススメ。

Page 13: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

ブロック構文

• こういうの。

• メソッドの引数に処理の固まりを渡すことが出来る。

• Cだと関数ポインタ使うと似たような事できるけど、冗長になる。JavaでもLambda使うと良いけど、比べると若干冗長。

10.times do puts 'Hello, World!'end

Page 14: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Cの例#include <stdio.h>

void times(int times , void (*func)(int));void myfunc(int i);

int main() { times(10, &myfunc); return 0;}

void times(int times , void (*func)(int)) { for(int i = 0; i < times; i++) { func(i); }}

void myfunc(int i) { printf("%i: Hello, World!\n", i);}

Page 15: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Javaの例

Page 16: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

黒魔術(メタプログラミング)• 下手に使うとダークサイドに落ちてしまうので、

通常の構文に慣れるまでは置いておきましょう。

• Rubyに新しい仕様を追加しているかのように見えるほどの、非常に強い拡張性をRubyに与えている。便利な分、使い方を誤ると暗黒面に堕ちてしまう。

• DSLの作成にもよく使われるテクニック

Page 17: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

発表の内容• CやJavaと比較しながらRubyを紹介します。

• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。

• 最初にざっくりとRubyの特徴を説明します。

• 次にC、Javaと比較しながら基本的な構文を紹介します。

• 最後にRubyの書籍を紹介します。

done!

Page 18: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

発表の内容• CやJavaと比較しながらRubyを紹介します。

• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。

• 最初にざっくりとRubyの特徴を説明します。

• 次にC、Javaと比較しながら基本的な構文を紹介します。

• 最後にRubyの書籍を紹介します。

done!

Page 19: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

ここからはRubyの基本構文を見ていきましょう。

Page 20: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Hello, World!

class Hello { public static void main(String[] args) { System.out.println("Hello, World!"); }}

#include <stdio.h>

int main() { printf("Hello, World!\n"); return 0;}

puts 'Hello, World!'

Page 21: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

変数宣言

int num = 1;

num = 1

• Rubyの変数には型がない。整数を入れた変数に、後から文字列を代入することも出来る。

Page 22: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

条件分岐# ifif num.even? puts '偶数だよ'elsif num.odd? puts '奇数だよ'else puts 'ほげー'end

# unlessunless num.even? puts '奇数だよ'else puts '偶数だよ'end

# 後置puts '偶数だよ' if num.even?puts '奇数だよ' unless num.even?

if (num % 2 == 0) { printf("偶数だよ\n"); } else if (num % 2 != 0) { printf("奇数だよ\n"); }

JavaはCとほとんど同じなので省略

Page 23: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

ループ

array = [1, 2, 3, 4, 5]array.each do |i| puts iend

int array[] = {1, 2, 3, 4, 5};for(int i : array) { System.out.println(i);}

int array[] = {1, 2, 3, 4, 5};int array_length = sizeof array /sizeof array[0]; for(int i = 0; i < array_length; i++) { printf("%i\n", array[i]);}

Page 24: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Rubyのループ• while, for, loopといった構文もあるが、余り

使われない。

• eachメソッドを使うのが基本。

• Arrayなどの繰り返し処理の対象となるクラスはEnumerableモジュールがmixinされており、mapやreduceと言ったメソッドも使える。(長くなるので、割愛)

Page 25: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

ここからはOOPに関して、 RubyとJavaを比較していきます。

RubyとJavaはどちらもオブジェクト指向プログラミング(OOP)言語だけど、微妙に違ったアプローチを取っている。

Page 26: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

型へのアプローチ

ここにRubyとJavaの思想の違いが現れている。 Rubyはプログラマの書きやすさを壊さない範囲で性能面の最適化をやっている。Javaははじめからパフォーマンスを考慮して、プリミティブ型を導入し、オブジェクト指向の世界を歪めている。

!

%純粋なオブジェクト指向言語とは言いがたい • 全てがオブジェクトというわけではない • プリミティブ型がある

Ruby

Java

純粋なオブジェクト指向言語 • 全てがオブジェクト

Page 27: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

型付けへのアプローチ

!

% 静的型付け • 変数やメソッドの宣言時に型を宣言する

Ruby

Java

動的型付け • 変数やメソッド作成時に型を宣言しない。 • ダックタイピング

• 外から見た振る舞いが同じなら、同じ型と見なす

Page 28: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

多重継承へのアプローチ

!

%

Interface • APIが宣言された Interface をクラスに追加し実装することで、クラスを拡張する。

• Java8からインターフェースが実装を持てるようになったため、RubyのMixinと同じことが出来るようになった?? • 参考: http://equj65.net/tech/java8mixin/

Ruby

Java

Mixin • 機能が定義されたそれだけではインスタンスを生成できないModuleをクラスに追加し、拡張する。

Page 29: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

private, protectedの違い

!

%• クラス内のみアクセス可能

• クラス内、同一パッケージ、サブクラスからアクセス可

Ruby

Java

• レシーバ無しでしか呼び出せない

• そのメソッドを持つオブジェクトが self であるコンテキスト(メソッド定義式や instance_eval )でのみ呼び出せる

参考: Ruby | Ruby の private と protected 。歴史と使い分け - Qiita http://qiita.com/tbpgr/items/6f1c0c7b77218f74c63e

違うと言う事だけは覚えておきましょう。

Page 30: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

発表の内容• CやJavaと比較しながらRubyを紹介します。

• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。

• 最初にざっくりとRubyの特徴を説明します。

• 次にC、Javaと比較しながら基本的な構文を紹介します。

• 最後にRubyの書籍を紹介します。

done!

done!

Page 31: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

発表の内容• CやJavaと比較しながらRubyを紹介します。

• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。

• 最初にざっくりとRubyの特徴を説明します。

• 次にC、Javaと比較しながら基本的な構文を紹介します。

• 最後にRubyの書籍を紹介します。

done!

done!

Page 32: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

Ruby入門書籍たのしいRuby • 他のプログラミング言語の経験やOOPへの理解に自身が無い方にオススメ。

• 丁寧な説明でじっくり学べます。

初めてのRuby • 他の言語の経験があり、OOPも理解されている方にオススメ。

•簡潔な説明で、厚みも薄いので読みやすい。

パーフェクトRuby • 網羅的で良いらしいです。(僕は読んでないです、、) • rubyの構文や組み込みライブラリはもちろんメタプログラミングからgemの作り方までおさえてあります。

Page 33: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

もっとRubyを使いこなすための書籍まつもとゆきひろコードの世界 • Rubyの思想的なところが理解できます。 • オブジェクト指向の話も多い。

プログラミング言語Ruby • Rubyの仕様がわかる本。詳細に書いてある。 •手元に1冊あると心強い。

メタプログラミングRuby • メタプログラミングの理解は脱Ruby初心者の条件!? • 1週間でメタプログラミングをマスター出来る構成になってます。Rails内部のメタプログラミングについての解説もあります。

Page 34: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

もっとRubyを使いこなすための書籍Effective Ruby • Rubyをもっと効果的に、効率的に使うためのノウハウが詰まってます。良書。

• こちらも脱初心者のための必読書。

Rubyのしくみ • Rubyの中身が解説してある数少ない内の1冊 •知的好奇心を満足させるためにも良い本。(僕はまだ読めてないんですが、、)

Page 35: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

発表の内容• CやJavaと比較しながらRubyを紹介します。

• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。

• 最初にざっくりとRubyの特徴を説明します。

• 次にC、Javaと比較しながら基本的な構文を紹介します。

• 最後にRubyの書籍を紹介します。

done!

done!

done!

Page 36: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

発表の内容• CやJavaと比較しながらRubyを紹介します。

• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。

• 最初にざっくりとRubyの特徴を説明します。

• 次にC、Javaと比較しながら基本的な構文を紹介します。

• 最後にRubyの書籍を紹介します。

done!

done!

done!

Page 37: C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1

楽しいRubyistライフを お過ごしください!