ruby学習メモ

オブジェクトの凍結(#freeze)

test1 = "string"
test2 = test1
test1.freeze # 凍結
test2[0] = "A"

test1が参照する文字列は凍結されているので TypeError が発生する

TypeError: can't modify frozen string
        from (irb):33:in `[]='
        from (irb):33
        from :0

オブジェクトの複写(#dup)

以下のように test2 に対して複写したオブジェクトを割り当てた場合、
凍結された test1 ではなく複写された test2 のオブジェクトに対して操作するためエラーは出ない

test1 = "string"
test2 = test1.dup
test1.freeze # 凍結
test2[0] = "A"

配列

irb(main):090:0* a = [ 3.14159, "pie", 99 ] #a = %{ 3.14159 pie 99 }
=> [3.14159, "pie", 99]
irb(main):091:0> a.class
=> Array
irb(main):092:0> a.length
=> 3
irb(main):093:0> a[0]
=> 3.14159
irb(main):094:0> a[0].class
=> Float
irb(main):095:0> a[1]
=> "pie"
irb(main):096:0> a[1].class
=> String
irb(main):097:0> a[2]
=> 99
irb(main):098:0> a[2].class
=> Fixnum
irb(main):099:0> a[3]
=> nil
irb(main):100:0> a[3].class
=> NilClass

配列の検索

以下のように配列の中身を検索するコードは

for i in 0...@songs.length
  return @songs[i] if title == @songs[i].name
end
return nil

以下のようにイテレーション機能の #find を利用して置き換えることが出来る

@songs.find {|song| title == song.name }