2014年6月28日
PHPerのためのRuby教室
ひがき @ Ruby関西
Rubyとは
• まつもとゆきひろ氏が開発
• スクリプト言語
• オブジェクト指向言語
• Ruby on Railsが有名
Rubyの世界観
• 文法だけではない違い
– データ構造
– イディオム
– ライブラリ
– 開発環境
• 考え方に影響を与える
Rubyとは
• matz が考えた最強のプログラミング言語
• 性能よりも生産性
• 開発者に心地よい言語
Rubyをキメると
気持ちいい
PHPと Ruby
できることに違いはない
Rubyの数値
# $age = 49;
age = 49
# $price = 10000;
price = 10_000 # => 10000
# M_PI
Math::PI # => 3.141592653589793
Rubyの整数
2 ** 1024 # => 1797693134862315907729305
1907890247336179769789423065727343008115
77326758055009631327084773224075...
Rubyの文字列
# $name = ’matz’;
name = ’matz’
# "$name($age)";
"#{name}(#{age})" # => "matz(49)"
Rubyの配列
# $a = array(1, 2, 3);
a = [1, 2, 3]
a.class # => Array
# $h = array(’a’ => 1, ’b’ => 2);
h = {’a’ => 1, ’b’ => 2}...
Rubyの特徴 ブロック
a = [1, 2, 3]
a.each do |i|
puts i * i
end
# >> 1
# >> 4
# >> 9
Rubyの特徴 ブロック
a = [1, 2, 3]
a.each{|i| puts i * i}
# >> 1
# >> 4
# >> 9
PHPの foreach と何が違うの?
• each は Array のメソッド
• ブロックは each の引数
– 高階関数
高階関数
a = [1, 2, 3]
puts_square = Proc.new do |i|
puts i * i
end
a.each(&puts_square)
# >> 1
# >> 4
# >> 9
ファイル入出力とブロック
# $fp = fopen("data.txt", "r");
f = open("data.txt")
while buf = f.gets
# ... なにか ...
end
# fclose($fp);
f.cl...
ファイル入出力とブロック
# file_get_contents("data.txt");
open("data.txt"){|f| f.read}
# file("data.txt");
open("data.txt"){|f| f.read...
ファイル入出力とブロック
アプリケーション ブロック File
§
¦
¤
¥{|f| f.read}
-生成
-open
 呼出

close
×
制御構造ではなくメソッド
def verbose
yield
yield
end
verbose{puts ’こんにちは’}
#  こんにちは
#  こんにちは
Mix-in
• クラスにモジュールを取り込む機能
– モジュール: 実装の集合体
• Enumerable
– 繰り返しに関するモジュール
– each メソッドを持つクラスで利用可能
BasicObject
Object
Mix-in
Kernel
Mix-in
Enumerable
map
select
inject
Array
Hash
each
each
繰り返し 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 +...
Rubyの特徴 オープンクラス
ruby.class # = String
ruby.upcase # = RUBY
ruby.compact
# ~ -:4:in ‘main’: undefined method
‘compact’ for ...
class String
def compact
gsub(/r?n/, ’’)
end
end
s = No Ruby,
No Life.
s.compact # = No Ruby,No Life.
自分の足を撃つ自由
Rubyは君を信頼する。Rubyは君を分別のある
プログラマとして扱う。Rubyはメタプログラミ
ングのような強力な力を与える。
ただし、大いなる力には、大いなる責任が伴なう
ことを忘れてはいけない。
—メタプログラミングR...
Rubyの特徴 DSL
• DSL (Domain Specific Language)
– ドメイン特化言語
∗ 高い抽象度
– Rubyは内部DSLを作りやすい
Rubyのクラス
class Person
def initialize name
@name = name
end
end
person = Person.new(’matz’)
person.name
# ~ -:7:in ‘main’: ...
設定かプログラムか DSL
class Person
attr_accessor :name
end
person.name # = matz
person.name = ’MATZ’
person.name # = MATZ
代入もメソッド
class Person
def name
@name
end
def name= name
@name = name
end
end
Object
Module
attr accessor
Class Person:Class
メソッドを作るメソッド
def self.my_attr_accessor var
instance_eval do
define_method(var) do
instance_variable_get(@#{var})
end
define...
DSLはつくれる
• 宣言的に記述する
• カッコを使わない
– ( ) メソッドの引数
– [ ] 配列
– { } ハッシュ、ブロック
Sinatra の例 DSL
require ’sinatra’
get ’/’ do
PHP Kansai
end
カッコを使うと……
require(’sinatra’)
get(’/’) {
PHP Kansai
}
配列の[ ]を取りたい
def sum(ary)
ary.inject{|s, i| s + i}
end
sum([1, 2, 3, 4, 5]) # = 15
sum [1, 2, 3, 4, 5] # = 15
可変長引数を使う
def sum(*ary)
ary.inject{|s, i| s + i}
end
sum 1, 2, 3, 4, 5 # = 15
ハッシュの{ }を取りたい
def max(hash)
hash.max{|a, b| a.last = b.last}
end
max({:AAPL=566.71,
:GOOG=605.23, :MSFT=31.16})
# = [:GOOG...
最後の引数なら省略可
def max(hash)
hash.max{|a, b| a.last = b.last}
end
max :AAPL=566.71,
:GOOG=605.23, :MSFT=31.16
# = [:GOOG, 605....
ハッシュの => も取りたい
max :AAPL=566.71,
:GOOG=605.23, :MSFT=31.16
# = [:GOOG, 605.23]
max AAPL: 566.71,
GOOG: 605.23, MSFT: 31.16...
DSLを作ってみよう
class Page
def layout(name, *size, margin)
...
end
end
カッコを使うと……
page.layout(:A4, [210, 297],
{:top = 10,
:bottom = 20,
:left = 18,
:right = 24})
これは Rubyのコードです
page.layout :A4, 210, 297,
top: 10,
bottom: 20,
left: 18,
right: 24
なぜDSL
• 抽象度・表現力が高い
• 問題領域に集中できる
まとめ
• PHPも Rubyも、できることに違いはない
• Rubyの特徴
– ブロック
– Mix-in
– オープンクラス
– DSLを作りやすい
もしRubyに興味を持ったら
• コミュニティ
– Ruby関西
– Minami.rb
– amagasaki.rb
– Shinosaka.rb
– Kyoto.rb
– Nishiwaki.rb  Higashinada.rb
– Wak...
Rubyをキメると
気持ちいい
Upcoming SlideShare
Loading in...5
×

PHPer のための Ruby 教室

1,655

Published on

PHPカンファレンス関西2014

Published in: Software
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,655
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
7
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

PHPer のための Ruby 教室

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

    Clipping is a handy way to collect important slides you want to go back to later.

×