SlideShare a Scribd company logo
1 of 32
Download to read offline
2015年8月8日
Ruby初級者向けレッスン 54回
— クラス —
ひがき @ Ruby関西
クラスとは
• オブジェクトの雛形
• 属性と振舞いを定義
– カプセル化 (データ・実装の隠蔽)
• Rubyはクラスベースのオブジェクト指向言語
クラスを作ってみよう
class Person; end
obj = Person.new
# => #<Person:0x007fb1a184a198>
obj.class # => Person
Person.superclass # => Object
属性を持たせてみよう
class Person
def initialize(name)
@name = name
end
end
matz = Person.new(’matz’)
# => #<Person:0x007fb1a1848438
@name="matz">
属性にアクセスしてみよう
• インスタンス変数は外から見えない
class Person
attr_reader :name
end
matz.name # => "matz"
変数・定数のおさらい
ローカル変数 person
インスタンス変数 @person
クラス変数 @@person
グローバル変数 $person
定数 Person
属性を増やしてみよう
class Person
def initialize(name, born = nil)
@name, @born = name, born
end
attr_accessor :born
end
matz.methods.map(&:to_s).grep(/born/)
# => ["born", "born="]
属性を増やしてみよう (2)
matz.born = Time.local(1965, 4, 14)
dhh = Person.new(’dhh’,
Time.local(1979, 10, 15))
matz.born
# => 1965-04-14 00:00:00 +0900
dhh.born
# => 1979-10-15 00:00:00 +0900
メソッドを作ってみよう
class Person
def age
(Time.now.strftime(’%Y%m%d’).to_i -
@born.strftime(’%Y%m%d’).to_i) /
1_00_00
end
end
matz.age # => 50
dhh.age # => 35
メソッドを上書きしてみよう
matz.to_s # => "#<Person:0x007fb1a184843
class Person
def to_s
"#{@name}(#{age})"
end
end
matz.to_s # => "matz(50)"
dhh.to_s # => "dhh(35)"
インスタンスを比較してみると…
person = Marshal.load(Marshal.dump matz)
# => matz(50)
person == dhh # => false
person == matz # => false # おかしい
順序を決めよう
class Person
include Comparable
def <=> o
@name <=> o.name
end
end
person == dhh # => false
person == matz # => true
matz > dhh # => true
Array#sort してみよう
people = [matz, dhh]
people.sort # => [dhh(35), matz(50)]
年齢順に sort してみよう
# 若い順
people.sort_by(&:age)
# => [dhh(35), matz(50)]
# 年功序列
people.sort_by{|p| -p.age}
# => [matz(50), dhh(35)]
people.sort_by(&:born)
Hash のキーにしてみると……
h = {matz => "Ruby", dhh => "Rails"}
h[matz] # => "Ruby"
h[dhh] # => "Rails"
key = Marshal.load(Marshal.dump matz)
key == matz # => true
h[key] # => nil # おかしい
hash 値を計算しよう
class Person
def hash
[@name, @born].hash
end
end
matz.hash # => -2004926503290248919
dhh.hash # => 2713023373120596011
key.hash # => -2004926503290248919
eql? を上書きしよう
class Person
def eql? o
[@name, @born].eql? [o.name, o.born]
end
end
key.eql? matz # => true
key.eql? dhh # => false
Hash にアクセスしてみよう
h.rehash
h[matz] # => "Ruby"
h[dhh] # => "Rails"
h[key] # => "Ruby"
等値性のおさらい
== 内容が等しいか?
=== case 式で使用
eql? Hash クラスが使用
equal? 同一オブジェクトか?
アクセス制御してみよう
• public
• protected
• private
class Person
protected :born
end
matz.born
# ~> protected method ‘born’ called for ma
Struct でクラスを作る
Person = Struct.new(:name, :born)
matz = Person.new(’matz’)
dhh = Person.new(’dhh’,
Time.local(1979, 10, 15))
person = Marshal.load(Marshal.dump matz)
person == matz # => true
person == dhh # => false
Struct なら等値性も
h = {matz => "Ruby", dhh => "Rails"}
key = Marshal.load(Marshal.dump matz)
h[matz] # => "Ruby"
h[dhh] # => "Rails"
h[key] # => "Ruby"
Struct でもメソッドを
class Person
def age
(Time.now.strftime(’%Y%m%d’).to_i -
born.strftime(’%Y%m%d’).to_i) /
1_00_00
end
end
dhh.age # => 35
今日 話さなかったこと
• 委譲と継承
• モジュール
• クラス変数・クラスメソッド
• Range の始点と終点
まとめ
• クラスの作り方
– 属性・アクセサ
– メソッド
• オブジェクトの等値性
演習問題 0
今日のレッスンで分からなかったこと、疑問に
思ったことをグループで話し合ってみよう。
演習問題 1
属性として身長と体重を追加しよう。体重は秘密
にしよう。
演習問題 2
BMI を計算するメソッドを追加しよう。
BMI =
w
t2
w = 体重[kg]
t = 身長[m]
演習問題 3
Person#<=> を書き直そう。
その妥当な仕様は?
p0 = Person.new(’matz’)
p1 = Person.new(’Matz’,
Time.local(1965, 4, 14))
p0 <=> p1 # => ?
演習問題 4
Person#=== を定義しよう。
その妥当な仕様は?
p0 = Person.new(’matz’)
p1 = Person.new(’Matz’,
Time.local(1965, 4, 14))
p0 === p1 # => ?
自己紹介
• 名前 (ニックネーム)
• 普段の仕事・研究内容・代表作
• Ruby歴・コンピュータ歴
• 勉強会に来た目的
• などなど
参考
• 公式サイト
https://www.ruby-lang.org/
• るりま
http://docs.ruby-lang.org/ja/
• 解答例
https://github.com/higaki/
learn ruby kansai 68

More Related Content

Similar to Ruby初級者向けレッスン 54回 ─── クラス

第3回輪講
第3回輪講第3回輪講
第3回輪講mh_amako
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
Ruby講座第二回
Ruby講座第二回Ruby講座第二回
Ruby講座第二回mitsunaga
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5Nishida Kansuke
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Kenta USAMI
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪yashigani
 
RSpecのここがすごい!
RSpecのここがすごい!RSpecのここがすごい!
RSpecのここがすごい!mitim
 
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装__nakamichi__
 
ransack, ransack, ransack
ransack, ransack, ransackransack, ransack, ransack
ransack, ransack, ransackKeisuke Ohta
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)Masahiro Hayashi
 

Similar to Ruby初級者向けレッスン 54回 ─── クラス (12)

第3回輪講
第3回輪講第3回輪講
第3回輪講
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Ruby講座第二回
Ruby講座第二回Ruby講座第二回
Ruby講座第二回
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
 
すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 
RSpecのここがすごい!
RSpecのここがすごい!RSpecのここがすごい!
RSpecのここがすごい!
 
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装
 
ransack, ransack, ransack
ransack, ransack, ransackransack, ransack, ransack
ransack, ransack, ransack
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)
 

More from higaki

Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版higaki
 
Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外higaki
 
Ruby初級者向けレッスン 53回 ─── Array と Hash
Ruby初級者向けレッスン  53回 ─── Array と HashRuby初級者向けレッスン  53回 ─── Array と Hash
Ruby初級者向けレッスン 53回 ─── Array と Hashhigaki
 
初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列higaki
 
初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外higaki
 
Ruby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と HashRuby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と Hashhigaki
 
Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列higaki
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unithigaki
 
ジュンク堂書店の方から来ました
ジュンク堂書店の方から来ましたジュンク堂書店の方から来ました
ジュンク堂書店の方から来ましたhigaki
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外higaki
 

More from higaki (10)

Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版Ruby初級者向けレッスン KOF2015 出張版
Ruby初級者向けレッスン KOF2015 出張版
 
Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外Ruby初級者向けレッスン 55回 ─── 例外
Ruby初級者向けレッスン 55回 ─── 例外
 
Ruby初級者向けレッスン 53回 ─── Array と Hash
Ruby初級者向けレッスン  53回 ─── Array と HashRuby初級者向けレッスン  53回 ─── Array と Hash
Ruby初級者向けレッスン 53回 ─── Array と Hash
 
初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列初級者向けレッスン 52回 ─── 文字列
初級者向けレッスン 52回 ─── 文字列
 
初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外初級者向けレッスン 51回 ─── 例外
初級者向けレッスン 51回 ─── 例外
 
Ruby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と HashRuby初級者向けレッスン 48回 ─── Array と Hash
Ruby初級者向けレッスン 48回 ─── Array と Hash
 
Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列Ruby初級者向けレッスン 47回 ─── 文字列
Ruby初級者向けレッスン 47回 ─── 文字列
 
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::UnitRuby初級者向けレッスン 第46回 ─── Test::Unit
Ruby初級者向けレッスン 第46回 ─── Test::Unit
 
ジュンク堂書店の方から来ました
ジュンク堂書店の方から来ましたジュンク堂書店の方から来ました
ジュンク堂書店の方から来ました
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外
 

Recently uploaded

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (9)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

Ruby初級者向けレッスン 54回 ─── クラス