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とは一体どのようにして内部で定義されているのか。
クラスを階層化して表示するメソッド
# クラスを階層化して表示するメソッド 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
使い方
classtree(String.new) #=>[String, Object, BasicObject, nil]
実行時間を計測するメソッド
def time_check(loop = 1) start_time = Time.now loop.times do yield end end_time = Time.now end_time - start_time end
使い方
triples = "AAA".."ZZZ" time_include = time_check(10**6) { triples.include? "ABC" } puts time_include