diff options
| author | ksss <[email protected]> | 2016-09-11 17:02:35 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2016-09-11 22:01:45 +0900 |
| commit | ff845be72cc146dc8c16d408a5694e6587de5957 (patch) | |
| tree | 4f34590b8e89469739b67a1b04687b377ba46ff2 | |
| parent | 7c9d941003b48d3551b28879598b3329c3b5d98b (diff) | |
| download | mruby-ff845be72cc146dc8c16d408a5694e6587de5957.tar.gz mruby-ff845be72cc146dc8c16d408a5694e6587de5957.zip | |
Support Array argument
| -rw-r--r-- | mrblib/file.rb | 61 | ||||
| -rw-r--r-- | test/file.rb | 2 |
2 files changed, 39 insertions, 24 deletions
diff --git a/mrblib/file.rb b/mrblib/file.rb index 86074c3e3..f84bd0ed3 100644 --- a/mrblib/file.rb +++ b/mrblib/file.rb @@ -19,34 +19,47 @@ class File < IO end def self.join(*names) - if names.size == 0 - "" - elsif names.size == 1 - names[0] - else - if names[0][-1] == File::SEPARATOR - s = names[0][0..-2] - else - s = names[0].dup - end - (1..names.size-2).each { |i| - t = names[i] - if t[0] == File::SEPARATOR and t[-1] == File::SEPARATOR - t = t[1..-2] - elsif t[0] == File::SEPARATOR - t = t[1..-1] - elsif t[-1] == File::SEPARATOR - t = t[0..-2] + return "" if names.empty? + + names.map! do |name| + case name + when String + name + when Array + if names == name + raise ArgumentError, "recursive array" end - s += File::SEPARATOR + t if t != "" - } - if names[-1][0] == File::SEPARATOR - s += File::SEPARATOR + names[-1][1..-1] + join(*name) else - s += File::SEPARATOR + names[-1] + raise TypeError, "no implicit conversion of #{name.class} into String" end - s end + + return names[0] if names.size == 1 + + if names[0][-1] == File::SEPARATOR + s = names[0][0..-2] + else + s = names[0].dup + end + + (1..names.size-2).each { |i| + t = names[i] + if t[0] == File::SEPARATOR and t[-1] == File::SEPARATOR + t = t[1..-2] + elsif t[0] == File::SEPARATOR + t = t[1..-1] + elsif t[-1] == File::SEPARATOR + t = t[0..-2] + end + s += File::SEPARATOR + t if t != "" + } + if names[-1][0] == File::SEPARATOR + s += File::SEPARATOR + names[-1][1..-1] + else + s += File::SEPARATOR + names[-1] + end + s end def self.expand_path(path, default_dir = '.') diff --git a/test/file.rb b/test/file.rb index 029454ea5..48a6eea9d 100644 --- a/test/file.rb +++ b/test/file.rb @@ -77,6 +77,8 @@ assert('File.join') do assert_equal "/a/b/c", File.join("/a", "b", "c") assert_equal "a/b/c/", File.join("a", "b", "c/") assert_equal "a/b/c", File.join("a/", "/b/", "/c") + assert_equal "a/b/c", File.join(["a", "b", "c"]) + assert_equal "a/b/c", File.join("a", ["b", ["c"]]) end assert('File.realpath') do |
