Literal syntax for array of arrays of strings


#1

We have this:

a = %w{ a b c d e f }
p a # ==> [“a”, “b”, “c”, “d”, “e”, “f”]

Has anyone ever felt the need for something like

a = %t{
a b c
d e f
} # ==> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

It’s probably too special (this is the first time in 8 years I’ve wanted
it), and it is easy to implement it as a method rather than a literal:

def table s
s.split("\n").map!{|t|t.split}
end

t = table %q{
a b c
d e f
}

p t # ==> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

Really just an idle question…


#2

From: Joel VanderWerf [mailto:removed_email_address@domain.invalid]

Has anyone ever felt the need for something like

a = %t{

a b c

d e f

} # ==> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

now the invisible ink (newline) has power :slight_smile: (cp dblack)

It’s probably too special (this is the first time in 8 years

I’ve wanted

it), and it is easy to implement it as a method rather than a literal:

def table s

s.split("\n").map!{|t|t.split}

end

now that is cool

t = table %q{\

           ^^^^

what is w the backquote?

a b c

d e f

}

p t # ==> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

on my case i get a,

#=> [["\"], [“a”, “b”, “c”], [“d”, “e”, “f”]]

had to do this instead,

table %q{ a b c
d e f
}

#=> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

but it’s still untamed,

table %q{ a b c
d e f
}
#=> [[“a”, “b”, “c”], [“d”, “e”, “f”], []]

i prefer instead the here-doc

table <<HERE
a b c
d e f
HERE
#=> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

and you can indent it

table <<-HERE
a b c
d e f
HERE

#=> [[“a”, “b”, “c”], [“d”, “e”, “f”]]


#3

Peña wrote:

t = table %q{\

           ^^^^

what is w the backquote?

To avoid an empty array, but I messed that up :frowning:

This is what I had originally (but I inserted the ‘q’ to make it a
single-quoted string, like the first example):

tb = table %{
a b c
d e f
}

p tb

i prefer instead the here-doc

table <<HERE
a b c
d e f
HERE
#=> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

Nice!


#4

Joel VanderWerf wrote:

d e f
t = table %q{
a b c
d e f
}

p t # ==> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

Really just an idle question…

class Array
def slices n
a = []
each_slice(n){|s| a << s}
a
end
end
==>nil
%w[a b c d e f].slices 3
==>[[“a”, “b”, “c”], [“d”, “e”, “f”]]


#5

2009/2/19 Joel VanderWerf removed_email_address@domain.invalid:

d e f
a b c
d e f
}

p t # ==> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

Really just an idle question…

You can also exploit the line iteration capabilities of String, which
is especially easy in 1.8.x

09:20:42 ddl$ irb19
Ruby version 1.9.1
irb(main):001:0> s = <<EOF
irb(main):002:0" a b c
irb(main):003:0" 1 2 3
irb(main):004:0" r t z
irb(main):005:0" EOF
=> “a b c\n1 2 3\nr t z\n”
irb(main):006:0> s.each_line.map {|x| x.scan /\S+/}
=> [[“a”, “b”, “c”], [“1”, “2”, “3”], [“r”, “t”, “z”]]
irb(main):007:0> exit
09:21:14 ddl$ irb
Ruby version 1.8.7
irb(main):001:0> s = <<EOF
irb(main):002:0" a b c
irb(main):003:0" 1 2 3
irb(main):004:0" r t z
irb(main):005:0" EOF
=> “a b c\n1 2 3\nr t z\n”
irb(main):006:0> s.map {|x| x.scan /\S+/}
=> [[“a”, “b”, “c”], [“1”, “2”, “3”], [“r”, “t”, “z”]]
irb(main):007:0> exit
09:21:48 ddl$

Kind regards

robert


#6

Joel VanderWerf wrote:

This is what I had originally (but I inserted the ‘q’ to make it a
single-quoted string, like the first example):

tb = table %{
a b c
d e f
}

What’s the difference between %Q and %?


#7

t = table %q{
a b c
d e f
}

I’d rather prefer a String#to_table method, I guess.

class String
def to_table(rx=nil)
split("\n").map!{|t|t.split(rx)}
end
end

Regards,
Thomas.


#8

Robert K. wrote:

2009/2/19 7stud – removed_email_address@domain.invalid:

What’s the difference between %Q and %?

irb(main):002:0> %{foo bar #{1+2}}
=> “foo bar 3”
irb(main):003:0> %Q{foo bar #{1+2}}
=> “foo bar 3”
irb(main):004:0> %q{foo bar #{1+2}}
=> “foo bar #{1+2}”

Uhmm…yeah. Those are the same results I got. Why would anyone use %Q
then? And where is the use of % like that documented?


#9

On 19.02.2009 14:26, 7stud – wrote:

Uhmm…yeah. Those are the same results I got. Why would anyone use %Q
then? And where is the use of % like that documented?

To make the quoting more obvious.

It must be somewhere in the Pickaxe but I don’t have my copy handy so I
cannot provide the page reference.

Kind regards

robert


#10

2009/2/19 7stud – removed_email_address@domain.invalid:

What’s the difference between %Q and %?

irb(main):002:0> %{foo bar #{1+2}}
=> “foo bar 3”
irb(main):003:0> %Q{foo bar #{1+2}}
=> “foo bar 3”
irb(main):004:0> %q{foo bar #{1+2}}
=> “foo bar #{1+2}”


#11

On Fri, Feb 20, 2009 at 7:54 AM, Robert K.
removed_email_address@domain.invalid wrote:

It must be somewhere in the Pickaxe but I don’t have my copy handy so I
cannot provide the page reference.
The new Pickaxe does not mention %, I have posted this to the erratum.
Would be interesting what was mentioned in the second edition.

Page 320f

mfg, simon … always lying next to me


#12

On Fri, Feb 20, 2009 at 7:54 AM, Robert K.
removed_email_address@domain.invalid wrote:

It must be somewhere in the Pickaxe but I don’t have my copy handy so I
cannot provide the page reference.
The new Pickaxe does not mention %, I have posted this to the erratum.
Would be interesting what was mentioned in the second edition.
Cheers
R


#13

Has anyone ever felt the need for something like

a = %t{
a b c
d e f
} # ==> [[“a”, “b”, “c”], [“d”, “e”, “f”]]

a = [ %w(a b c), %w(d e f) ]

mfg, simon … l


#14

Simon K. wrote:

mfg, simon … l

True, but that doesn’t allow copy-and-paste from a source that doesn’t
know about %.


#15

On Sun, Feb 22, 2009 at 11:04 PM, Simon K. removed_email_address@domain.invalid wrote:

Page 320f
Would you mind telling us?
R.


#16

On Sun, Feb 22, 2009 at 11:04 PM, Simon K. removed_email_address@domain.invalid wrote:

Page 320f

Would you mind telling us?

It’s in chapter 22 The Ruby Language, Basic Types, Strings:

“Double-quoted string literals (“stuff”, %Q/stuff/, and %/stuff/)
undergo additional substitutions, shown in table 22.2 on the next page.”

That table shows the backslash escapes and #{code}.

mfg, simon … l


#17

On Mon, Feb 23, 2009 at 1:04 PM, Simon K. removed_email_address@domain.invalid wrote:

  • Robert D. <robert.dober@gmail.
    "Double-quoted string literals (“stuff”, %Q/stuff/, and %/stuff/)
    thanx Simon, that what I wanted to know