2007/09/29 PHP to Ruby - Webキャリアさん主催 ”PHPプログラマの為のRuby on...
-
Upload
yuichiro-masui -
Category
Technology
-
view
5.709 -
download
2
Transcript of 2007/09/29 PHP to Ruby - Webキャリアさん主催 ”PHPプログラマの為のRuby on...
Yuichiro MASUI <[email protected]>
Rubyの基礎PHPer向け
そのまえに・・・
自己紹介
増井 雄一郎masuidrive
株式会社ワイズノット株式会社オープンソース総合研究所
1992高校2年で
フリープログラマー
1996PlayStationのゲームとか作ったりネットしたり
1999大学6年生で会社立ち上げ
ネット全般なんでも屋DoCoMoの仕事とか
ビジネスモデルなんて何もない
2002PukiWiki開発チーム
立ち上げ
2004会社畳む
Distroの手伝いしたり組み込みLinuxしたり
Distroの手伝いしたり組み込みLinuxしたり
Distroの手伝いしたり組み込みLinuxしたり
2005/4Railsに出会う
2005/1210分で作るRailsアプリムービー&雑誌記事公開
予想通りの大反響
2005後半からなるべくRailsで仕事をしていた
2006Rails仕事だけで一年食うを目標に
2006/04フルRailsのモール
オープン
2006/05WEB2.0から
PingKingリリース
2006/07デザイン会社SHIFTと
コラボa new city guide
ファンクラブサイト大学ミスコンブログ
and more...
ITProの記事を見てNIFTYから次のお誘い
次の仕事が決まっていたのでα版までの契約
その後は他社に引き継ぎでもRailsやったことない
OJT込みで
企画からだったのでとりあえず合宿
もちろんRailsでon the fly programming
色々サンプルを作った結果が今の形
一年ホントにRails仕事だけで食えちゃった
しかも札幌に住みながら
しかも札幌に住みながら
しかも札幌に住みながら
2007/06アバウトミーリリース
PHPの方
Javaの方
Perlの方
10分ムービーを見た方
実際にやってみた方
Railsのアプリを構築した方
作ったアプリを公開しちゃった方
Rubyでつまづきそうな所をなんとなく理解してもらう
つまづく所
正規表現ブロックイテレータ
リフレクションオープンクラス
Ruby1993年生まれ 14歳
素直なオブジェクト指向
文法がシンプル
100.times do |i| puts iend
全てがオブジェクト
puts 10.to_s+"Yen"
PHPとの違い
変数
ten = 10
英小文字,もしくは_で始まる$で始まるとグローバル変数@で始まるとインスタンス変数@@で始まるとクラス変数
インスタンス変数とクラス変数については
後ほど
変数スコープ
変数の頭に$が付くのはグローバル変数だけ
ブロック単位でスコープが存在する
function func($v) { if($v==1) { $var = 'test'; } echo $var;}func(1);=> test
PHP
def func(a) if a==1 var = 'test' end puts varendfunc(1)=>
Ruby
PHPは同じ関数内ならどこでも変数を操作可能
Rubyではローカル変数のスコープはブロック内でのみ
使用可能
def func(a) var = ‘’ if a==1 var = 'test' end puts varendfunc=> test
Ruby
親ブロックの変数を子ブロックで
書き換えることは可能
定数
"文字定数"'文字定数'
"文字定数#{式}"ダブルクオートのみ
puts <<__EOD__ヒアドキュメントも使えます__EOD__
Ruby
英大文字で始まるのは定数LENGTH=10
配列
添え字は0から[式, 式, 式..]で配列生成配列にアクセスするには
配列[添え字]
ary = [1,2,3]ary << 4p ary=> 1, 2, 3, 4p ary.pop=> 4p ary.pop=> 3
ハッシュ連想配列
キーはなんでもいい{キー1=>値1, キー2=>値2}
でハッシュ生成ハッシュ[キー]でアクセス
hash = {'k1'=>'v1', 'k2'=>'v2', 'k3'=>'v3'}p hash['k2']=> v2
シンボル
コロンで始まる文字列:class:include:ver1
:"ver3.5"
たいていの場合はStringと交換可能
式
1+1func1()val = 2*3index += 2
foo, bar, baz = 1, 2, 3foo, *bar = 1, 2, 3
range = 2..5
i++は無い!
i < 10i != 0
test && functest || funcnot val!val
正規表現
正規表現もオブジェクト
/^A.*Z/
str ~= /^A.*Z//^A.*Z/.match(str)
カッコ付けなくてイイ
puts('test')↓
puts 'test'
カッコ以外にも色々省略可能
行末の;も要らない
if a==b then test()end ↓if a==b testend
ハッシュ(連想配列)を表す{}も省略可能
func({:order=>'date', :user=>'a'})↓
func :order=>'date', :user=>'a'
ブロック
プログラムをひとくくりにするのが
ブロック
ブロックは{ ... }でも
do ... endでもいい
Rubyではブロックもオブジェクト化できる
イテレータのところで説明
制御構造
分岐
if a==b func1()elsif c==b func2()else func3()end
unless a==b func1()else func2()end
if !(a==b) func1()else func2()end
=
puts("Hi!") if name=="Taro"
buy() unless wallet.empty?if修飾子
case fruitswhen 'orange', 'apple' puts 'Love'when 'kiwi' puts 'Hate!'else puts "What's?"end
case hourwhen 4..9 puts '朝'when 10..19 puts '昼'when 20..23, 0..3 puts '晩'end
繰り返し
for i in [1,2,3] puts iend
i = 0while i<3 puts i i += 1end
Rubyで繰り返しといえばイテレータ
イテレータ (Iterator) とは、プログラミング言語において配列やそれに類似するデータ構造の各要素に対する繰返し処理の抽象化である。実際のプログラミング言語では、オブジェクトまたは文法などとして現れる。反復するためのものの意味で反復子(はんぷくし)と訳される。イテレータには内部イテレータと外部イテレー
タの区分がある。
イテレータ - Wikipedia
ファイル読み込みのように件数が分からないループとかに
向いている
while($books->hasNext()) { $book = $books->next(); echo $book->getName()."\n";}
PHPで外部イテレータ
books = [Book.new,...]books.each do |book| puts book.nameend
Rubyで内部イテレータ
5.times do |i| puts iend
Rubyで内部イテレータ
a = [1,3,5,6,7,10]p a.select { |i| i % 2 == 0 }
Rubyで内部イテレータ
a = [1,3,5,6,7,10]p a.map { |i| i * 2 }
繰り返しをforなどではなくメソッドで行う
Rubyのイテレータの仕組み
class Books def each ..... yield ..... endend
呼び出し時に付けたブロックを呼び出す
books.each do |str| puts strend
books.each do |str| puts strend
def each for line in @lines yield line endend
books.each do |str| puts strend
def each for line in @lines yield line endend
books.each do |str| puts strend
イテレータを使いこなせるとRubyっぽい書き方ができる
メソッド定義
def func1 ....end
def func2(arg1) ....end
def func3(arg1,arg2=10) ....end
def func1 return 1+1enddef func2 2+3end
返値
returnが無ければ最後に評価した式が返値
例外処理
begin ....rescue 例外クラス => e puts "Error!"ensure finalizer()end
必ず実行
例外処理
func1() rescue error_handle()rescue 修飾子
クラス
class Book def name @name end
def name=(str) @name = str endend
クラス名は大文字からメソッド定義
インスタンス変数(メンバ変数)
メソッド名に=も使える
book = Book.newbook.name = "Rails recipe"
p bookputs book.name
book = Book.newbook.name = "Rails recipe"
p bookputs book.name
name=メソッドを呼び出し
book.name = ‘Rails Recipe”は、属性変更に見えるが実はメソッド呼び出し
コンストラクタはdef initialize .....end
クラスメソッドスタティックメソッドシングルトンメソッド
class Book @@owner = nil def self.owner @@owner end
def self.owner=(str) @@owner = str endend
クラスメソッド定義
クラス変数
クラス変数
Book.owner = 'Masui'book = Book.newputs book.owner=> "Masui"Book.owner = 'masuidrive'puts book.owner=> "masuidrive"
クラスメソッドはクラス定義文のなかで呼び出しができる
class Note < Book owner = ‘test’end
ダックタイピング
もしもそれがアヒルのように歩きアヒルのように鳴くのなら
それはアヒルである
Stringの様に生成できStringの様に合成できるなら
Stringである
JavaではStringであるなら必ず基底クラスはString
Rubyではクラス名は重要ではない
Stringの様に振る舞えばいい
オープンクラス
クラスをいつでも変更可能
StringだってIntegerだって好きにできちゃう
class String def hatena self+"?" endend"test".hatena=>test?
ついでにオブジェクトにメソッド定義も出来ちゃう
特異メソッド
str = "test"def str.sharp "#"+selfendstr.sharp=> #test“test”.sharp=> Error!
モジュール
インスタンスを生成できないクラス↓
モジュール
継承 & Mix-in
class Note < Book def memo .... endend
class Note extend Book def memo .... endend
モジュールをクラスに読み込むのがmix-in
class Note < Book include Enumeration def memo .... endend
Bookを継承したNoteにEnumerableの機能をMix-in!
標準クラス
String - 文字列Integer - 整数Float - 実数Array - 配列
Hash - ハッシュ(連想配列)Time - 時間Range - 範囲