# Question on redefining the File.join mechanism

**URL:** <https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791>\
**Category:** Ruby\
**Created:** [May 12, 2009, 4:00pm UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791 "2009-05-12T16:00:50Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 12, 2009, 4:00pm UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791/1 "2009-05-12T16:00:50Z")

</div>

I’m running Ruby over WindowsXP-Pro/SP2. So I wanted File.join to use  
backslash.

I tried:

class WFile \< File  
def join(arg1, arg2)  
super.join(arg1, arg2).gsub(///, ‘\’)  
end  
end

but WFile.join(s1,s2) didn’t work. My question is why?

BTW, I don’t want to start or enter into a debate about the wisdom  
nor aesthetics of this approach.

Also, I got the File.wjoin to work (using the code below), so I’m  
happy. I just want to learn why my first idea is flawed.

class File # Join with a backslash rather than a forward slash  
def File.wjoin(arg1, arg2)  
join(arg1, arg2).gsub(///, ‘\’)  
end  
end

Thanks in Advance,  
Richard

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 12, 2009, 4:10pm UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791/2 "2009-05-12T16:10:47Z")

</div>

> I just want to learn why my first idea is flawed.

I believe one culprit is probably  
super.join

In fact, I never saw super.join, only super() on something.

Where did you see super.something ?

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 13, 2009, 7:50am UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791/3 "2009-05-13T07:50:42Z")

</div>

> In fact, I never saw super.join, only super() on something.
> 
> Where did you see super.something ?

Must have been in a dream 🙂 Please see my solution in my reply to  
Robert.

Thanks for your response,  
Richard

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 12, 2009, 4:35pm UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791/4 "2009-05-12T16:35:35Z")

</div>

2009/5/12 RichardOnRails [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> I’m running Ruby over WindowsXP-Pro/SP2. So I wanted File.join to use  
> backslash.
> 
> I tried:
> 
> class WFile \< File  
> def join(arg1, arg2)  
> super.join(arg1, arg2).gsub(///, ‘\’)

That line should look like one of these variants:

super.gsub(///, ‘\’)  
super(arg1, arg2).gsub(///, ‘\’)

However, since join is a class method you would want to define it as  
class method in WFile.

irb(main):001:0\> class WFile \< File  
irb(main):002:1\> def self.join(\*a) super.gsub(%r{/}, ‘\\’) end  
irb(main):003:1\> end  
=\> nil  
irb(main):004:0\> WFile.join “foo”, “bar”, “baz”  
=\> “foo\bar\baz”  
irb(main):005:0\>

> class File # Join with a backslash rather than a forward slash  
> def File.wjoin(arg1, arg2)  
> join(arg1, arg2).gsub(///, ‘\’)  
> end  
> end

Another however: since you are defining a single method only the  
question is whether it warrants a comlete class. Why not just define  
wjoin in class File or simply override File’s definition, e.g.

def File.join(\*a)  
a.join ‘\’  
end

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 13, 2009, 8:00am UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791/5 "2009-05-13T08:00:40Z")

</div>

On May 12, 10:34 am, Robert K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> irb(main):003:1\> end
> 
> > but WFile.join(s1,s2) didn’t work. My question is why?  
> > end  
> > Kind regards
> 
> robert
> 
> –  
> remember.guy do |as, often| as.you\_can - without endhttp://blog.rubybestpractices.com/

Hi Robert,

Thanks to Marc in the previous post and to you, my head cleared and  
following is the solution I sought, which is a style that suits my  
aesthetics 🙂 :

class WFile  
def WFile.join(arg1, arg2)  
File.join(arg1, arg2).gsub(///, ‘\’)  
end  
end

puts WFile.join(‘foo’, ‘bar’) # =\> foo\bar

Ya gotta love comp.lang.ruby.

Best wishes,  
Richard

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 13, 2009, 9:40pm UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791/6 "2009-05-13T21:40:32Z")

</div>

On 13.05.2009 08:31, RichardOnRails wrote:

> Now I see that you’ve reduced the matter to Array#join, so I could  
> simple write:
> 
> [‘foo’, ‘bar’].join ‘\’ # =\> foo\bar,

Exactly.

> but wrapping in a 3-liner like yours probably simplifies invocation.  
> I’ll think about it some more. Your 3-liner looks like one more “best  
> practice”, which site I just visited.
> 
> Thanks for education in Ruby elegance.

You’re welcome! Just another remark: it’s been a while that I used the  
Windows version of Ruby (I work mostly on cygwin and Linux) but as far  
as I remember if you need those file names only internally (i.e. in the  
Ruby program) then the regular File.join will do as you can use forward  
and backward slashes.

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 14, 2009, 6:05pm UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791/7 "2009-05-14T18:05:50Z")

</div>

> … then the regular File.join will do as you can use  
> forward and backward slashes.

That has been my experience, but I don’t like relying on that and  
finally decided to fix it to my liking.

Thanks again and best wishes,  
Richard

---

<div class="post-metadata">

**Author:** ![RichardOnRails](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e0b2c6/32.png) [@RichardOnRails](https://www.ruby-forum.com/u/RichardOnRails)\
**Post date:** [May 13, 2009, 8:35am UTC](https://www.ruby-forum.com/t/question-on-redefining-the-file-join-mechanism/167791/8 "2009-05-13T08:35:55Z")

</div>

On May 12, 10:34 am, Robert K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> irb(main):003:1\> end
> 
> > but WFile.join(s1,s2) didn’t work. My question is why?  
> > end  
> > Kind regards
> 
> robert
> 
> –  
> remember.guy do |as, often| as.you\_can - without endhttp://blog.rubybestpractices.com/

Hi, again, Robert,

Just a little follow-up. When I first read your response, I grabbed  
your “class method” observation and ran with it. I saw your  
additional 3-liner, but didn’t understand it at first glance.

Now I see that you’ve reduced the matter to Array#join, so I could  
simple write:

[‘foo’, ‘bar’].join ‘\’ # =\> foo\bar,

but wrapping in a 3-liner like yours probably simplifies invocation.  
I’ll think about it some more. Your 3-liner looks like one more “best  
practice”, which site I just visited.

Thanks for education in Ruby elegance.

Best wishes,  
Richard
