Hi Folks,
I’m porting an error reporting system from Perl to Ruby as a way of
getting up the Ruby learning curve. Apologies in advance if my
question has already been answered - I did a cursory search and got
no hits.
I’m running up against my lack of detailed Ruby knowledge, and I was
wondering if someone could provide some advice - I’m sure that Ruby
supports what I want to do.
In the Perl world, I had a system where I could specify an error
message and a set of parameters to that message, as follows:
do_error(message, [parameters]);
for example:
do_error("param 1: '%s', param 2 : '%s', param 3 : '%s'",
"detail1", "detail2", "detail3");
would give the result:
param 1: 'detail1', param 2 : 'detail2', param 3 : 'detail3'
The perl implementation looks like this:
sub do_error {
my ($message, @params) = @_;
printf($message, @params);
}
As you can see, the idea is that the user is able to specify both
their error message and where in their message string various
parameters appear.
In this case, Perl was very obliging because parameter lists are
simply arrays. Passing an array into printf became equivalent to
passing the appropriate number of parameters.
So, in Ruby, I have the following code:
printf “#{@message}\n”, @params
Where class instance variable @params is an array. I have verified
that it really is an array and not getting mangled somewhere in my
class by using ‘@params.inspect’.
Unfortunately, it seems that Ruby is treating the array in what Perl
folks would call a “scalar context”. The printf is getting a mangled
version of the array contents and this is triggering a runtime error
from Ruby.
For example:
@params = ["foo", "bar"]
print @params.inspect
>>> ["foo", "bar"]
printf("%s %s", @params)
>>> ErrorClasses.rb:32:in `printf': too few arguments (ArgumentError)
I did some experiments, and it appears that printf is actually seeing:
“foobar”
instead of the array of 2 elements. If I have the right number of ‘%
s’ conversion codes in the format string, I get this message because
Ruby thinks I’ve only passed on parameter, not many.
For the record, here’s the Ruby version I’m using
BigWhite:nick> ruby -v
ruby 1.8.4 (2005-12-24) [i686-darwin8.8.1]
What would Ruby’s code look like to achieve what I want?
Thanks in advance,
Nick