On 02/28 02:59, nobu (Nobuyoshi Nakada) wrote:
> 
> Issue #7982 has been updated by nobu (Nobuyoshi Nakada).
> 
> Status changed from Open to Rejected
> 
> =begin
> Sorry, you can't use (({%i})) for (({rb_raise()})), (({rb_warn()})), and so on.
> It's now used for (({Object}))s.
> 
> Use (({%d})) instead.
> =end

The Changelog entry for this is:

* vsnprintf.c (BSD_vfprintf): [EXPERIMENTAL] object representation in
  rb_enc_vsprintf(). [Feature #5896]

There is no indication that %i is now handled differently than before.
For a C programmer, overriding %i which has historically been used for
integers is very confusing and error prone.  It is true that ruby is
not C, but this is a C API, and rb_raise's documentation in README.EXT
states:

void rb_raise(rb_eRuntimeError, const char *fmt, ...) ::

  Raises RuntimeError.  The fmt is a format string just like printf().

I content that the format string syntax in ruby 2.0.0 is not "just
like printf()".  Maybe "similar to printf(), with the following
exceptions: ..."?

As this is still marked EXPERIMENTAL, it would be better if another
letter that isn't already supported by printf(3) was used instead.
At the very least, if you plan to continue the use of %i for object
representation, there should be specific notes in the documentation.

Thanks,
Jeremy