Your SlideShare is downloading. ×
  • Like
PHPer のための Ruby 教室
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

PHPer のための Ruby 教室

  • 1,502 views
Published

PHPカンファレンス関西2014

PHPカンファレンス関西2014

Published in Software
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,502
On SlideShare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
7
Comments
0
Likes
5

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

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をキメると 気持ちいい