c,javaと比較しながらrubyに入門する話 - e-zuka rails拡大号vol1
TRANSCRIPT
Ruby入門
谷口耕平 @ran_tan
ハウインターナショナル でRuby on Railsを使って大学向けの教育サービスを作ってます。
自己紹介
発表の内容• CやJavaと比較しながらRubyを紹介します。
• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。
• 最初にざっくりとRubyの特徴を説明します。
• 次にC、Javaと比較しながら基本的な構文を紹介します。
• 最後にRubyの書籍を紹介します。
発表の内容• CやJavaと比較しながらRubyを紹介します。
• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。
• 最初にざっくりとRubyの特徴を説明します。
• 次にC、Javaと比較しながら基本的な構文を紹介します。
• 最後にRubyの書籍を紹介します。
!Rubyとは?• 島根県松江市在住の まつもとゆきひろ さん
(通称 Matz)を中心に開発されているOSSのプログラミング言語
• Rubyは今年で23歳くらい
• 最新バージョンは v2.3.0
• 日本人のコミッターが多く、国内のRubyコミュニティは非常に活発。
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
Rubyのここが好き
Rubyは楽しい!
Rubyは 「読みやすい」かつ 「書きやすい」ので 「作りたいものに集中出来る」そして、作る事は楽しい。 短く言うと「Rubyは楽しい」
「Rubyは楽しい!」を支えるもの
• 全てが「オブジェクト」である
• 充実した組み込みライブラリ
• ブロック構文
• 黒魔術(メタプログラミング)
全てが「オブジェクト」である
• 数値も文字列も配列もオブジェクトなので直感的なコードが書ける
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"]
充実した組み込みライブラリ• ドキュメント http://docs.ruby-lang.org/ja/
• 特に、String, Array, Hashなどよく使うクラスのメソッドが充実しているので、いろんな処理がさくっと書ける。
Rubyで使えるライブラリ
!Ruby
組み込みライブラリ 標準添付ライブラリ
Rubyをインストールすると入るもの
+ + RubyGems
OSSの gem を gem コマンドでインストール可能RubyGems.org には様々なライブラリ( gem )がある z
z
沢山ある
https://rubygems.org/ で探せる。https://www.ruby-toolbox.com/ で探すのもオススメ。
ブロック構文
• こういうの。
• メソッドの引数に処理の固まりを渡すことが出来る。
• Cだと関数ポインタ使うと似たような事できるけど、冗長になる。JavaでもLambda使うと良いけど、比べると若干冗長。
10.times do puts 'Hello, World!'end
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);}
Javaの例
黒魔術(メタプログラミング)• 下手に使うとダークサイドに落ちてしまうので、
通常の構文に慣れるまでは置いておきましょう。
• Rubyに新しい仕様を追加しているかのように見えるほどの、非常に強い拡張性をRubyに与えている。便利な分、使い方を誤ると暗黒面に堕ちてしまう。
• DSLの作成にもよく使われるテクニック
発表の内容• CやJavaと比較しながらRubyを紹介します。
• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。
• 最初にざっくりとRubyの特徴を説明します。
• 次にC、Javaと比較しながら基本的な構文を紹介します。
• 最後にRubyの書籍を紹介します。
done!
発表の内容• CやJavaと比較しながらRubyを紹介します。
• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。
• 最初にざっくりとRubyの特徴を説明します。
• 次にC、Javaと比較しながら基本的な構文を紹介します。
• 最後にRubyの書籍を紹介します。
done!
ここからはRubyの基本構文を見ていきましょう。
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!'
変数宣言
int num = 1;
num = 1
• Rubyの変数には型がない。整数を入れた変数に、後から文字列を代入することも出来る。
条件分岐# 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とほとんど同じなので省略
ループ
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]);}
Rubyのループ• while, for, loopといった構文もあるが、余り
使われない。
• eachメソッドを使うのが基本。
• Arrayなどの繰り返し処理の対象となるクラスはEnumerableモジュールがmixinされており、mapやreduceと言ったメソッドも使える。(長くなるので、割愛)
ここからはOOPに関して、 RubyとJavaを比較していきます。
RubyとJavaはどちらもオブジェクト指向プログラミング(OOP)言語だけど、微妙に違ったアプローチを取っている。
型へのアプローチ
ここにRubyとJavaの思想の違いが現れている。 Rubyはプログラマの書きやすさを壊さない範囲で性能面の最適化をやっている。Javaははじめからパフォーマンスを考慮して、プリミティブ型を導入し、オブジェクト指向の世界を歪めている。
!
%純粋なオブジェクト指向言語とは言いがたい • 全てがオブジェクトというわけではない • プリミティブ型がある
Ruby
Java
純粋なオブジェクト指向言語 • 全てがオブジェクト
型付けへのアプローチ
!
% 静的型付け • 変数やメソッドの宣言時に型を宣言する
Ruby
Java
動的型付け • 変数やメソッド作成時に型を宣言しない。 • ダックタイピング
• 外から見た振る舞いが同じなら、同じ型と見なす
多重継承へのアプローチ
!
%
Interface • APIが宣言された Interface をクラスに追加し実装することで、クラスを拡張する。
• Java8からインターフェースが実装を持てるようになったため、RubyのMixinと同じことが出来るようになった?? • 参考: http://equj65.net/tech/java8mixin/
Ruby
Java
Mixin • 機能が定義されたそれだけではインスタンスを生成できないModuleをクラスに追加し、拡張する。
private, protectedの違い
!
%• クラス内のみアクセス可能
• クラス内、同一パッケージ、サブクラスからアクセス可
Ruby
Java
• レシーバ無しでしか呼び出せない
• そのメソッドを持つオブジェクトが self であるコンテキスト(メソッド定義式や instance_eval )でのみ呼び出せる
参考: Ruby | Ruby の private と protected 。歴史と使い分け - Qiita http://qiita.com/tbpgr/items/6f1c0c7b77218f74c63e
違うと言う事だけは覚えておきましょう。
発表の内容• CやJavaと比較しながらRubyを紹介します。
• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。
• 最初にざっくりとRubyの特徴を説明します。
• 次にC、Javaと比較しながら基本的な構文を紹介します。
• 最後にRubyの書籍を紹介します。
done!
done!
発表の内容• CやJavaと比較しながらRubyを紹介します。
• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。
• 最初にざっくりとRubyの特徴を説明します。
• 次にC、Javaと比較しながら基本的な構文を紹介します。
• 最後にRubyの書籍を紹介します。
done!
done!
Ruby入門書籍たのしいRuby • 他のプログラミング言語の経験やOOPへの理解に自身が無い方にオススメ。
• 丁寧な説明でじっくり学べます。
初めてのRuby • 他の言語の経験があり、OOPも理解されている方にオススメ。
•簡潔な説明で、厚みも薄いので読みやすい。
パーフェクトRuby • 網羅的で良いらしいです。(僕は読んでないです、、) • rubyの構文や組み込みライブラリはもちろんメタプログラミングからgemの作り方までおさえてあります。
もっとRubyを使いこなすための書籍まつもとゆきひろコードの世界 • Rubyの思想的なところが理解できます。 • オブジェクト指向の話も多い。
プログラミング言語Ruby • Rubyの仕様がわかる本。詳細に書いてある。 •手元に1冊あると心強い。
メタプログラミングRuby • メタプログラミングの理解は脱Ruby初心者の条件!? • 1週間でメタプログラミングをマスター出来る構成になってます。Rails内部のメタプログラミングについての解説もあります。
もっとRubyを使いこなすための書籍Effective Ruby • Rubyをもっと効果的に、効率的に使うためのノウハウが詰まってます。良書。
• こちらも脱初心者のための必読書。
Rubyのしくみ • Rubyの中身が解説してある数少ない内の1冊 •知的好奇心を満足させるためにも良い本。(僕はまだ読めてないんですが、、)
発表の内容• CやJavaと比較しながらRubyを紹介します。
• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。
• 最初にざっくりとRubyの特徴を説明します。
• 次にC、Javaと比較しながら基本的な構文を紹介します。
• 最後にRubyの書籍を紹介します。
done!
done!
done!
発表の内容• CやJavaと比較しながらRubyを紹介します。
• 前提:どの言語を使うかは適材適所。利用シーンの定義無しに言語の優劣は語れない。
• 最初にざっくりとRubyの特徴を説明します。
• 次にC、Javaと比較しながら基本的な構文を紹介します。
• 最後にRubyの書籍を紹介します。
done!
done!
done!
楽しいRubyistライフを お過ごしください!