Skip to content

Instantly share code, notes, and snippets.

@ieda
Last active August 29, 2015 14:11
Show Gist options
  • Save ieda/adb6c9bc2a97f9020412 to your computer and use it in GitHub Desktop.
Save ieda/adb6c9bc2a97f9020412 to your computer and use it in GitHub Desktop.
イミュータブルオブジェクトと、そうではないオブジェクトの違いを掴む
=begin
以下のコードでは、数値を表すモデルを、
イミュータブルなオブジェクトになるような定義と、
イミュータブルではないオブジェクトになるような定義の
2つで実装している。
2つのオブジェクトに対して、ほぼ同じ操作を行い、
その振る舞いの違いから知見を得ることを想定している。
=end
class ImmutableNumber
attr_reader :value
def initialize(init_value)
@value = init_value
end
def plus(other_value)
ImmutableNumber.new(@value + other_value)
end
def to_s
@value.to_s
end
end
class MutableNumber
attr_reader :value
def initialize(init_value)
@value = init_value
end
def plus!(other_value)
@value += other_value
end
def to_s
@value.to_s
end
end
immutable_number = ImmutableNumber.new(1)
reference_immutable_number = immutable_number
immutable_number.plus(1)
puts immutable_number # => 1
puts reference_immutable_number # => 1
=begin
immutable_number = ImmutableNumber.new(1)
immutable_number.plus(1)
puts immutable_number # => 1
の一連の流れは、直感に反するかもしれない。
そうだとしたら、イメージしたものはこちらに近いかもしれない。
immutable_number = ImmutableNumber.new(1)
reference_immutable_number = immutable_number
immutable_number = immutable_number.plus(1)
puts immutable_number # => 2
puts reference_immutable_number # => 1
=end
mutable_number = MutableNumber.new(1)
reference_mutable_number = mutable_number
mutable_number.plus!(1)
puts mutable_number # => 2
puts reference_mutable_number # => 2
=begin
reference_mutable_numberに対しては、一度代入を行っただけである。
それにも関わらず、出力結果が代入時のmutable_numberの値から変わっている。
=end
=begin
ImmutableNumberクラスは説明用のクラス。
Integerクラスの振る舞いの一部を切り出しただけ。
=end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment