convert String to range

  • Follow


Hi,
is there a way to convert a string to a range??
"(1..2)" ==> (1..2) ??
Another question, what's the translation of infinite  in ruby??
thanks
-- 
Posted via http://www.ruby-forum.com/.

0
Reply abboura84 (16) 2/8/2008 9:36:58 AM

I tried to monkey patch the Range class, but it doesn't seem to work,
so I patched the String class:

class String
    def to_range
        case self.count('.')
            when 2
                elements = self.split('..')
                return Range.new(elements[0].to_i, elements[1].to_i)
            when 3
                elements = self.split('...')
                return Range.new(elements[0].to_i, elements[1].to_i-1)
            else
                raise ArgumentError.new("Couldn't convert to Range: #{str}")
        end
    end
end

p "1..2".to_range
p "1...2".to_range
p "1.2".to_range

output:
1..2
1..1
rng.test:11:in `to_range': undefined local variable or method `str'
for "1.2":String (NameError)
	from rng.test:18

0
Reply wieczo.yo (134) 2/8/2008 9:55:30 AM


On Feb 8, 2008 3:36 AM, Abir B. <abboura84@yahoo.fr> wrote:
> Another question, what's the translation of infinite  in ruby??
> thanks

irb(main):001:0> 0 / 0.0
=> NaN
irb(main):002:0> 42 / 0.0
=> Infinity
irb(main):003:0> -42 / 0.0
=> -Infinity

You can also use the #nan? and #infinity? methods.  AFAIK, this works
only with Floats and BigDecimals.

hth,
Todd

0
Reply caduceass (829) 2/8/2008 10:19:46 AM

thanks a lot
I'll try it... :-)
-- 
Posted via http://www.ruby-forum.com/.

0
Reply abboura84 (16) 2/8/2008 10:27:52 AM

Abir B. wrote:
> Hi,
> is there a way to convert a string to a range??
> "(1..2)" ==> (1..2) ??
> Another question, what's the translation of infinite  in ruby??
> thanks
>   
Not recommended, but eval is always an option:

irb(main):001:0> r = eval("(1..2)")
=> 1..2
irb(main):002:0> r.class
=> Range
irb(main):003:0> r.to_a
=> [1, 2]

-Justin

0
Reply justincollins (215) 2/8/2008 8:29:17 PM

Thomas Wieczorek wrote:
> I tried to monkey patch the Range class, but it doesn't seem to work,
> so I patched the String class:
> 

I am not sure what the rules for the request should be, but

p "(1..2)".to_range     # 0..2 original request
p "1.2 - 7.2 + 3".to_range   # 1..0
p '"a".."c"'.to_range   # 0..0

all produce things I wouldn't want.

I see Justin Collins got in the eval suggestion before I
finished looking at it.  I note that

eval("1.....7")

causes a syntax mistake.  Is there a way to handle syntax
problems parallel to execution errors?

Ian
-- 
Posted via http://www.ruby-forum.com/.

0
Reply iw1junk (1195) 2/8/2008 9:36:41 PM

Ian Whitlock wrote:
> Thomas Wieczorek wrote:
>   
>> I tried to monkey patch the Range class, but it doesn't seem to work,
>> so I patched the String class:
>>
>>     
>
> I am not sure what the rules for the request should be, but
>
> p "(1..2)".to_range     # 0..2 original request
> p "1.2 - 7.2 + 3".to_range   # 1..0
> p '"a".."c"'.to_range   # 0..0
>
> all produce things I wouldn't want.
>
> I see Justin Collins got in the eval suggestion before I
> finished looking at it.  I note that
>
> eval("1.....7")
>
> causes a syntax mistake.  Is there a way to handle syntax
> problems parallel to execution errors?
>
> Ian
>   

This is a pretty strange way to go about it, but it will work even in 
the presence of errors:

require 'thwait'

def make_range(str)
        r = nil
        thr = Thread.new do
                $SAFE = 4
                begin
                        r = eval(str)
                rescue
                end
        end

        ThreadsWait.new(thr).all_waits

        r.is_a?(Range) ? r : nil
end

p make_range("1.....7")               # nil
p make_range("(1..2)")               # 1..2
p make_range("1.2 - 7.2 + 3")    # nil
p make_range('"a".."c"')              # "a".."c"
p make_range("exit!")                 # nil
p make_range("load 'evilfile.rb'") # nil


For some reason, trying to use Thread.join will prevent the exception 
handling from working.

-Justin

0
Reply justincollins (215) 2/8/2008 10:25:41 PM

6 Replies
38 Views

(page loaded in 0.11 seconds)

Similiar Articles:













7/22/2012 1:48:00 AM


Reply: