marg's diary

Rubyistになるため日々奮闘中

Stringオブジェクトが凍結できない?

初歩的かもしれないが躓いたのでメモ

class Person
 attr_accessor :name
 def initialize(name)
  @name = name
 end
end

john = Person.new("John")
john.freeze
(john.name = "Tony") rescue p $! #=> #<RuntimeError: can't modify frozen Person>
str = String.new("Hello!")
str.freeze

str = "Hi!"
str #=>"Hi!"

あ、あれえ?(freezeしたはずなのに書き換えられた!)

str = String.new("Hello!")
str.freeze

str.upcase! rescue p $! #=>#<RuntimeError: can't modify frozen String>

こちらはちゃんとエラーが出る。


少し考えればわかることだったのですが、freezeメソッドでは参照自体を変更不可能にすることはできないようでした。
2番目のコードでは、strの参照自体が変わってしまったので、普通に書き換えができた。
3番目では、参照は変更せずにStringオブジェクトの中身を書き換えようとしていたので、freezeされたことによってエラー。

NaNとは一体何か?(未解決)

気になったことがあったのでメモ

def classtree(obj)
	tree = Array.new
	tree[0] = obj.class
	i=0
	while(tree[i] != nil) 
		i += 1
		tree[i] = tree[i-1].superclass
	end
	tree
end

nan = 0.0/0.0 #=> NaN
pp classtree(nan) #=> [Float, Numeric, Object, BasicObject, nil]

Floatクラスが持つ値であることはわかったが、
NaNとは一体どのようにして内部で定義されているのか。