====== Ruby - Tips ======
===== パス操作 =====
==== ファイルパスからファイル名を取得する ====
File.basename("/path/to/script/name.rb")
#=> "name.rb"
==== ファイルパスから拡張子を除いたファイル名を取得する ====
File.basename("/path/to/script/name.rb",".rb")
#=> "name"
==== ファイルパスから拡張子を取得する ====
File.extname("/path/to/script/name.rb")
#=> ".rb"
==== ファイルパスからディレクトリパスを取得する ====
File::dirname("/path/to/script/name.rb")
#=> "/path/to/script"
==== ディレクトリパスからディレクトリ名を取得する ====
File::basename("/path/to/script")
#=> "script"
===== close/dup =====
dupメソッドはオブジェクトの内容を複製し、cloneメソッドは特異メソッドを含めた完全な複製を作成する。どちらも「浅い」コピーなため、深い階層の場合片方のオブジェクトに対する変更がもう片方に影響する。
#!/usr/bin/ruby
# coding: utf-8
argv1 = {
"Name1" => "Ruby",
"Name2" => "Perl",
"Versions" => {
"Ruby" => 1.93,
"Perl" => 5.16,
},
}
argv2 = argv1.dup
argv1["Versions"]["Ruby"] = "2.00"
p argv1 # => {"Name1"=>"Ruby", "Name2"=>"Perl", "Versions"=>{"Ruby"=>"2.00", "Perl"=>5.16}}
p argv2 # => {"Name1"=>"Ruby", "Name2"=>"Perl", "Versions"=>{"Ruby"=>"2.00", "Perl"=>5.16}}
内部の参照も含めた「深い」コピーが必要な場合は、以下のMarshalメソッドを使う。
===== Marshal =====
#!/usr/bin/ruby
# coding: utf-8
argv1 = {
"Name1" => "Ruby",
"Name2" => "Perl",
"Versions" => {
"Ruby" => 1.93,
"Perl" => 5.16,
},
}
argv2 = Marshal.load(Marshal.dump(argv1))
argv1["Versions"]["Ruby"] = "2.00"
p argv1 # => {"Name1"=>"Ruby", "Name2"=>"Perl", "Versions"=>{"Ruby"=>"2.00", "Perl"=>5.16}}
p argv2 # => {"Name1"=>"Ruby", "Name2"=>"Perl", "Versions"=>{"Ruby"=>1.93, "Perl"=>5.16}}