[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Problem with HERE document as first parameter (parser bug?

Ronald Fischer

7/11/2007 11:47:00 AM

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
--
Ronald Fischer <ronald.fischer@venyon.com>
Phone: +49-89-452133-162


4 Answers

Stefan Rusterholz

7/11/2007 11:53:00 AM

0

Ronald Fischer wrote:
> 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

--
Posted via http://www.ruby-....

John Joyce

7/11/2007 12:26:00 PM

0


On Jul 11, 2007, at 6:53 AM, Stefan Rusterholz wrote:

> Ronald Fischer wrote:
>> 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
>
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

Robert Klemme

7/11/2007 12:54:00 PM

0

2007/7/11, Ronald Fischer <ronald.fischer@venyon.com>:
> 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

Stefan Rusterholz

7/11/2007 6:30:00 PM

0

Valeri Mytinski wrote:
> 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

--
Posted via http://www.ruby-....