Problem with HERE document as first parameter (parser bug?)

R

Ronald Fischer

I have problems passing a HERE document as the first parameter
to a function expecting more than 1 parameter. Example:

# This is file here1.rb
def q(a,b)
end
q(<<-END
line1
line2
END
,'x')


Executing this program yields the error messages

/here1.rb:9: syntax error, unexpected ',', expecting ')'
,'x')
^
/here1.rb:9: syntax error, unexpected ')', expecting $end


Using a temporary variable to hold the content of the HERE
string works fine though:

temp=3D<<-END
line1
line2
END
q(temp,'x')


Bug in Ruby? Or do I misunderstand something in the workings of the
parser?

Ronald
--=20
Ronald Fischer <[email protected]>
Phone: +49-89-452133-162
=20
 
S

Stefan Rusterholz

Ronald said:
I have problems passing a HERE document as the first parameter
to a function expecting more than 1 parameter. Example:

# This is file here1.rb
def q(a,b)
end
q(<<-END
line1
line2
END
,'x')


Executing this program yields the error messages

./here1.rb:9: syntax error, unexpected ',', expecting ')'
,'x')
^
./here1.rb:9: syntax error, unexpected ')', expecting $end


Using a temporary variable to hold the content of the HERE
string works fine though:

temp=<<-END
line1
line2
END
q(temp,'x')


Bug in Ruby? Or do I misunderstand something in the workings of the
parser?

Ronald

Not a bug in the parser, just wrong usage.
q(<<-END, 'x')
line1
line2
END

That will work.

Regards
Stefan
 
J

John Joyce

Not a bug in the parser, just wrong usage.
q(<<-END, 'x')
line1
line2
END

That will work.

Regards
Stefan
While it works, it is, IMHO, ugly and a little obfuscated.
It is much better to simply assign the heredoc to a variable, and put
the variable name in the function parameter.
I know it is a correct form, but some times linguistically correct is
not always good for you. (most people know what I mean if I mention C )

John Joyce
 
R

Robert Klemme

2007/7/11 said:
I have problems passing a HERE document as the first parameter
to a function expecting more than 1 parameter. Example:

# This is file here1.rb
def q(a,b)
end
q(<<-END
line1
line2
END
,'x')


Executing this program yields the error messages

./here1.rb:9: syntax error, unexpected ',', expecting ')'
,'x')
^
./here1.rb:9: syntax error, unexpected ')', expecting $end

I believe you have got the order wrong. Do it like this:

$ ruby -e 'def f(a,b) p a,b end
f(<<XXX, 123)
foo
bar
XXX' "foo\nbar\n"
123

Using a temporary variable to hold the content of the HERE
string works fine though:

temp=<<-END
line1
line2
END
q(temp,'x')


Bug in Ruby? Or do I misunderstand something in the workings of the
parser?

The latter, see above. :)

Kind regards

robert
 
S

Stefan Rusterholz

Valeri said:
irb(main):072:0> def q(a,b)
irb(main):073:1> puts a
irb(main):074:1> puts b
irb(main):075:1> end
=> nil
irb(main):076:0> q('1',<<-END
irb(main):077:1" 2
irb(main):078:1" END
irb(main):079:1> )
1
2
=> nil

If correctness of usage depends on parameters order - is this a bug?

I'm actually suprised, that your usage works.

puts('1', <<END)
2
END

That's how I'd have written it.
You can also use multiple

puts(<<FIRST, <<SECOND)
1
FIRST
2
SECOND

Or apply methods

puts(<<FIRST.upcase, <<SECOND.capitalize)
first
FIRST
second
SECOND
# (will print "FIRST" newline "Second")

Btw, no need for the 'q' method, puts can handle multiple arguments ;-)

Regards
Stefan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top