12/16(水)にNTT-ATさんの会議室にてkawasaki.rb #031を開催しました。
togetterのまとめはこちら
パーフェクトRuby読書会
「4-3-1 オブジェクトの基本的な振る舞い」まで終えました。
4-3 オブジェクト
ほとんどのクラスはObjectから派生したサブクラスです。スーパークラスを指定しなかった場合、自動的にObjectクラスを継承します。
1
2
3
4
class MyClass
end
MyClass.superclass #=> Object
また、すべてのクラスはBasicObjectを継承しており、BasicObjectにはメソッドがほとんど定義されておらず、委譲やプロキシの実装などの特定の用途に使用されるとのことです。
BasicObjectを継承しているクラスの1つに、Delegatorクラスが紹介されました。
1
2
require 'delegate'
puts Delegator.superclass # => BasicObject
4-3-1 オブジェクトの基本的な振る舞い
Objectクラスには、そのオブジェクトの情報を返すメソッドや比較演算子など、オブジェクトとしての基本的な機能が実装されています。
1
2
3
4
5
6
7
8
9
10
11
o = Object.new
# 自身についての情報を返す
o.class # => Object(どのクラスのオブジェクトか)
o.is_a?(Object) # => true(Objectのインスタンスか)
o.object_id # => 70235618382160 (オブジェクト固有のID)
o.nil? # => false (nilか)
o.frozen? # => false (freezeされているか)
# 自身をブロック引数にしてブロックを実行し、自身を返す
o.tap { |v| puts v } # => #<Object:0x007fc2022a13b0>
ここで少し freeze
の挙動について触れました。
freezeはオブジェクトの内容の変更を禁止するメソッドです。
1
2
3
s = "hoge".freeze
s.frozen? # => true
s.upcase! # => can't modify frozen String (RuntimeError)
文中のtapの使い方についても触れました。 tapは、例えば次のように処理のコンテキストを表したい時に使ったり、
1
2
3
Recipe.make.tap do |r|
Author.make(recipd_id: r.id)
end
もしくはメソッドチェーンの途中でデバッグしたい時に使用することが多い、という話をしました。
1
2
3
"kawasaki.rb".upcase.
tap { |s| puts s }. # => メソッドチェーン中の処理が表示される
reverse
なお、この書き方を省略するためにtappというgemが存在します。
Object#==は同一性を返す演算子メソッドですが、ほとんどのクラスでは同値性を返すようオーバーライドしています。
1
2
3
4
p Object.new == Object.new # => false
p [1,2,3] == [1,2,3] # => true
p /pattern/ == /pattern/ # => true
p 'Alice' == 'Alice' # => true
同値性を返すようにオーバーライドするには、例えば以下のようにします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Ruler
attr_accessor :length
def initialize(length)
self.length = length
end
def ==(other)
length == other.length
end
end
r1 = Ruler.new(10)
r2 = Ruler.new(10)
p r1 == r2 # => true
今回のiruby notebookは以下のとおりです。
セッション
本日のKawasaki.rbのセッションではPythonの発表が2つありました。
SympyとJupyter notebookで数式のメモを取ろう from @chezouさん
SympyとJupyter notebookを使って、数式をレンダリングしたり、方程式の展開、微分・積分ができる!という発表をされました。
発表元の記事はこちら
RubyエンジニアがPythonをdisるためにPythonを勉強してみた from @kon_yuさん
@kon_yuさんがPyladies Tokyoで発表されたLTの再演をしていただきました。会場ではKawasaki.rb主催者との掛け合いが白熱しました。
次回予告
次回は2016/1/27(水)開催予定です。ご参加お待ちしております。
寄稿者について
松久保 敬人 (@Peranikov)
RailsからiOSから何でもやってる人だったが、今はDDDとScalaの人。 お酒を投稿するサイトPuhaar!を運営しています。