PHPer のための Ruby 教室
Upcoming SlideShare
Loading in...5
×
 

PHPer のための Ruby 教室

on

  • 1,251 views

PHPカンファレンス関西2014

PHPカンファレンス関西2014

Statistics

Views

Total Views
1,251
Views on SlideShare
1,246
Embed Views
5

Actions

Likes
4
Downloads
3
Comments
0

2 Embeds 5

https://twitter.com 4
http://www.slideee.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

PHPer のための Ruby 教室 Presentation Transcript

  • 1. 2014年6月28日 PHPerのためのRuby教室 ひがき @ Ruby関西
  • 2. Rubyとは • まつもとゆきひろ氏が開発 • スクリプト言語 • オブジェクト指向言語 • Ruby on Railsが有名
  • 3. Rubyの世界観 • 文法だけではない違い – データ構造 – イディオム – ライブラリ – 開発環境 • 考え方に影響を与える
  • 4. Rubyとは • matz が考えた最強のプログラミング言語 • 性能よりも生産性 • 開発者に心地よい言語
  • 5. Rubyをキメると 気持ちいい
  • 6. PHPと Ruby できることに違いはない
  • 7. Rubyの数値 # $age = 49; age = 49 # $price = 10000; price = 10_000 # => 10000 # M_PI Math::PI # => 3.141592653589793
  • 8. Rubyの整数 2 ** 1024 # => 1797693134862315907729305 1907890247336179769789423065727343008115 7732675805500963132708477322407536021120 1138798713933576587897688144166224928474 3063947412437776789342486548527630221960 1246094119453082952085005768838150682342 4628814739131105408272371633505106845862 9823994724593847971630483535632962422413 7216
  • 9. Rubyの文字列 # $name = ’matz’; name = ’matz’ # "$name($age)"; "#{name}(#{age})" # => "matz(49)"
  • 10. Rubyの配列 # $a = array(1, 2, 3); a = [1, 2, 3] a.class # => Array # $h = array(’a’ => 1, ’b’ => 2); h = {’a’ => 1, ’b’ => 2} h.class # => Hash
  • 11. Rubyの特徴 ブロック a = [1, 2, 3] a.each do |i| puts i * i end # >> 1 # >> 4 # >> 9
  • 12. Rubyの特徴 ブロック a = [1, 2, 3] a.each{|i| puts i * i} # >> 1 # >> 4 # >> 9
  • 13. PHPの foreach と何が違うの? • each は Array のメソッド • ブロックは each の引数 – 高階関数
  • 14. 高階関数 a = [1, 2, 3] puts_square = Proc.new do |i| puts i * i end a.each(&puts_square) # >> 1 # >> 4 # >> 9
  • 15. ファイル入出力とブロック # $fp = fopen("data.txt", "r"); f = open("data.txt") while buf = f.gets # ... なにか ... end # fclose($fp); f.close
  • 16. ファイル入出力とブロック # file_get_contents("data.txt"); open("data.txt"){|f| f.read} # file("data.txt"); open("data.txt"){|f| f.readlines}
  • 17. ファイル入出力とブロック アプリケーション ブロック File § ¦ ¤ ¥{|f| f.read} -生成 -open  呼出  close ×
  • 18. 制御構造ではなくメソッド def verbose yield yield end verbose{puts ’こんにちは’} # >> こんにちは # >> こんにちは
  • 19. Mix-in • クラスにモジュールを取り込む機能 – モジュール: 実装の集合体 • Enumerable – 繰り返しに関するモジュール – each メソッドを持つクラスで利用可能
  • 20. BasicObject Object Mix-in Kernel Mix-in Enumerable map select inject Array Hash each each
  • 21. 繰り返し Enumerable a = [1, 2, 3, 5] a.map{|i| i * i} # => [1, 4, 9, 25] a.select{|i| i.odd?} # => [1, 3, 5] a.inject{|s, i| s + i} # => 11 a.find{|i| i.odd?} # => 1 a.all?{|i| i.even?} # => false a.any?{|i| i.even?} # => true
  • 22. Rubyの特徴 オープンクラス "ruby".class # => String "ruby".upcase # => "RUBY" "ruby".compact # ~> -:4:in ‘<main>’: undefined method ‘compact’ for "ruby":String (NoMethodErro
  • 23. class String def compact gsub(/r?n/, ’’) end end s = "No Ruby, No Life." s.compact # => "No Ruby,No Life."
  • 24. 自分の足を撃つ自由 Rubyは君を信頼する。Rubyは君を分別のある プログラマとして扱う。Rubyはメタプログラミ ングのような強力な力を与える。 ただし、大いなる力には、大いなる責任が伴なう ことを忘れてはいけない。 —メタプログラミングRuby 序文より
  • 25. Rubyの特徴 DSL • DSL (Domain Specific Language) – ドメイン特化言語 ∗ 高い抽象度 – Rubyは内部DSLを作りやすい
  • 26. Rubyのクラス class Person def initialize name @name = name end end person = Person.new(’matz’) person.name # ~> -:7:in ‘<main>’: undefined method ‘name’ for #<Person:0x007fe8409c8eb8 @nam
  • 27. 設定かプログラムか DSL class Person attr_accessor :name end person.name # => "matz" person.name = ’MATZ’ person.name # => "MATZ"
  • 28. 代入もメソッド class Person def name @name end def name= name @name = name end end
  • 29. Object Module attr accessor Class Person:Class
  • 30. メソッドを作るメソッド def self.my_attr_accessor var instance_eval do define_method(var) do instance_variable_get("@#{var}") end define_method("#{var}=") do |val| instance_variable_set("@#{var}", val) end end end
  • 31. DSLはつくれる • 宣言的に記述する • カッコを使わない – ( ) メソッドの引数 – [ ] 配列 – { } ハッシュ、ブロック
  • 32. Sinatra の例 DSL require ’sinatra’ get ’/’ do "PHP Kansai" end
  • 33. カッコを使うと…… require(’sinatra’) get(’/’) { "PHP Kansai" }
  • 34. 配列の[ ]を取りたい def sum(ary) ary.inject{|s, i| s + i} end sum([1, 2, 3, 4, 5]) # => 15 sum [1, 2, 3, 4, 5] # => 15
  • 35. 可変長引数を使う def sum(*ary) ary.inject{|s, i| s + i} end sum 1, 2, 3, 4, 5 # => 15
  • 36. ハッシュの{ }を取りたい def max(hash) hash.max{|a, b| a.last <=> b.last} end max({:AAPL=>566.71, :GOOG=>605.23, :MSFT=>31.16}) # => [:GOOG, 605.23]
  • 37. 最後の引数なら省略可 def max(hash) hash.max{|a, b| a.last <=> b.last} end max :AAPL=>566.71, :GOOG=>605.23, :MSFT=>31.16 # => [:GOOG, 605.23]
  • 38. ハッシュの => も取りたい max :AAPL=>566.71, :GOOG=>605.23, :MSFT=>31.16 # => [:GOOG, 605.23] max AAPL: 566.71, GOOG: 605.23, MSFT: 31.16 # => [:GOOG, 605.23]
  • 39. DSLを作ってみよう class Page def layout(name, *size, margin) ... end end
  • 40. カッコを使うと…… page.layout(:A4, [210, 297], {:top => 10, :bottom => 20, :left => 18, :right => 24})
  • 41. これは Rubyのコードです page.layout :A4, 210, 297, top: 10, bottom: 20, left: 18, right: 24
  • 42. なぜDSL • 抽象度・表現力が高い • 問題領域に集中できる
  • 43. まとめ • PHPも Rubyも、できることに違いはない • Rubyの特徴 – ブロック – Mix-in – オープンクラス – DSLを作りやすい
  • 44. もしRubyに興味を持ったら • コミュニティ – Ruby関西 – Minami.rb – amagasaki.rb – Shinosaka.rb – Kyoto.rb – Nishiwaki.rb & Higashinada.rb – Wakayama.rb
  • 45. Rubyをキメると 気持ちいい