ユーザ用ツール

サイト用ツール


ruby:tips

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}}

ruby/tips.txt · 最終更新: 2018/07/20 14:19 by taka