Chars in Ruby

Hi,

I've been playing with characters (OK, there's no such type in
Ruby, it's rather like characters in C - just plain integer numbers).

String of length 1 to a char: str1[0] --> chr_int
Char to a String of length 1: chr_int.chr --> str1

Get a char from a string: str[n] --> chr_int # or nil
Put a char into a string: str[n] = chr_int

So we can think of a "char" as a single element of a string.
Now, having that an integer is a single element of an array,
we'd like to have functions/expressions for converting arrays
of integers and strings back and forth.

Array to String: [97,98,99].map{|e|e.chr}.join --> "abc"
String to Array: "abc" ??? --> [97,98,99]

I've found that this function can do it:

def s2a(s); r=[]; s.each_byte {|b| r<<b}; r; end
s2a("abc") --> [97,98,99]

But can it be an expression w/o a function or with a shorter
"more elegant" function, w/o accumulator r?

Regards,
Georgy

···

--
Georgy Pruss
E#Mail: 'naabbcaDaddaLryDwksvKmyw'.tr('a-zA-Z','0-9a-z.@')

use pack() and unpack()

···

il Sat, 05 Jun 2004 10:40:45 GMT, "Georgy" <see@the.end> ha scritto::

Hi,

So we can think of a "char" as a single element of a string.
Now, having that an integer is a single element of an array,
we'd like to have functions/expressions for converting arrays
of integers and strings back and forth.

Array to String: [97,98,99].map{|e|e.chr}.join --> "abc"
String to Array: "abc" ??? --> [97,98,99]

I've found that this function can do it:

def s2a(s); r=; s.each_byte {|b| r<<b}; r; end
s2a("abc") --> [97,98,99]

But can it be an expression w/o a function or with a shorter
"more elegant" function, w/o accumulator r?

"Georgy" <see@the.end> wrote in message

Array to String: [97,98,99].map{|e|e.chr}.join --> "abc"
String to Array: "abc" ??? --> [97,98,99]

         How about: "abc".split('').collect{|e| e[0]}

   Just applied the inverse transforms of what you did to get Array
   to String ...and of course, as GR mentioned, you can pack/unpack.

E#Mail: 'naabbcaDaddaLryDwksvKmyw'.tr('a-zA-Z','0-9a-z.@')

-- shanko

"Georgy" <see@the.end> schrieb im Newsbeitrag
news:Nqhwc.15070$tH1.434991@twister.southeast.rr.com...

Hi,

I've been playing with characters (OK, there's no such type in
Ruby, it's rather like characters in C - just plain integer numbers).

String of length 1 to a char: str1[0] --> chr_int
Char to a String of length 1: chr_int.chr --> str1

Get a char from a string: str[n] --> chr_int # or nil
Put a char into a string: str[n] = chr_int

So we can think of a "char" as a single element of a string.
Now, having that an integer is a single element of an array,
we'd like to have functions/expressions for converting arrays
of integers and strings back and forth.

Array to String: [97,98,99].map{|e|e.chr}.join --> "abc"

This is more efficient:

[97,98,99].inject(""){|str,ch|str<<ch}

But of course the pack / unpack pair is the most appropriate way to do it as
others told already.

    robert

Ah! Thanks! I suspected there must be something better :slight_smile:
G-:

"gabriele renzi" <surrender_it@remove.yahoo.it> wrote in message news:8h93c09hnbir8jo870418pamm6b6jl5tmf@4ax.com...

···

use pack() and unpack()

Thank you! That's what I wanted. I didn't think split would treat '' so specially.
G-:

"Shashank Date" <sdate@everestkc.net> wrote in message news:2idv9fFlbg47U1@uni-berlin.de...

···

"Georgy" <see@the.end> wrote in message
> Array to String: [97,98,99].map{|e|e.chr}.join --> "abc"
> String to Array: "abc" ??? --> [97,98,99]

         How about: "abc".split('').collect{|e| e[0]}

   Just applied the inverse transforms of what you did to get Array
   to String ...and of course, as GR mentioned, you can pack/unpack.

-- shanko

--
Georgy Pruss
E#Mail: 'naabbcaDaddaLryDwksvKmyw'.tr('a-zA-Z','0-9a-z.@')