Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Question on redefining the File.join mechanism

Reply
Thread Tools

Question on redefining the File.join mechanism

 
 
RichardOnRails
Guest
Posts: n/a
 
      05-12-2009
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


 
Reply With Quote
 
 
 
 
Marc Heiler
Guest
Posts: n/a
 
      05-12-2009
> 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 ?
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Robert Klemme
Guest
Posts: n/a
 
      05-12-2009
2009/5/12 RichardOnRails <(E-Mail Removed)>:
> I'm running Ruby over WindowsXP-Pro/SP2. =A0So I wanted File.join to use
> backslash.
>
> I tried:
>
> class WFile < File
> =A0def join(arg1, arg2)
> =A0 =A0super.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
=3D> nil
irb(main):004:0> WFile.join "foo", "bar", "baz"
=3D> "foo\\bar\\baz"
irb(main):005:0>

> =A0end
> end
>
> but WFile.join(s1,s2) didn't work. =A0My question is why?
>
> BTW, =A0I don't want to start or enter into a debate about the wisdom
> nor aesthetics of this approach.
>
> Also, =A0I got the File.wjoin to work (using the code below), so I'm
> happy. =A0I just want to learn why my first idea is flawed.
>
> class File # Join with a backslash rather than a forward slash
> =A0def File.wjoin(arg1, arg2)
> =A0 =A0join(arg1, arg2).gsub(/\//, '\\')
> =A0end
> 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

--=20
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

 
Reply With Quote
 
RichardOnRails
Guest
Posts: n/a
 
      05-13-2009
> 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
 
Reply With Quote
 
RichardOnRails
Guest
Posts: n/a
 
      05-13-2009
On May 12, 10:34*am, Robert Klemme <(E-Mail Removed)> wrote:
> 2009/5/12 RichardOnRails <(E-Mail Removed)>:
>
> > 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>
>
>
>
> > *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

>
> 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
>
> --
> 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
 
Reply With Quote
 
RichardOnRails
Guest
Posts: n/a
 
      05-13-2009
On May 12, 10:34*am, Robert Klemme <(E-Mail Removed)> wrote:
> 2009/5/12 RichardOnRails <(E-Mail Removed)>:
>
> > 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>
>
>
>
> > *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

>
> 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
>
> --
> 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
 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      05-13-2009
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


--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
 
Reply With Quote
 
RichardOnRails
Guest
Posts: n/a
 
      05-14-2009
> ... 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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Railsy Question about redefining ruby methods... Xeno Campanoli Ruby 8 05-27-2008 11:36 AM
Easy question about redefining a function Martin Bootsma C Programming 6 07-06-2006 08:27 PM
Redefining an enumerated attribute type Nick Bassiliades XML 1 12-12-2005 01:21 PM
please help me in distinguish redefining functions, overloading functions and overriding functions. Xiangliang Meng C++ 1 06-21-2004 03:11 AM
redefining cout (for using printf/mexprintf) uli C++ 5 04-21-2004 04:04 AM



Advertisments