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!を運営しています。

Published: December 16 2015

blog comments powered by Disqus