Issue #15149 has been updated by nobu (Nobuyoshi Nakada).


foonlyboy (Eike Dierks) wrote:
> I believe that `%p` is for pointers.

It's true in C, but Ruby does not show bare pointers.
`%p` calls `inspect` instead.

> Please explain your complaints about compatibility.
> 
> This is a new feature
> Obviously libraries which want to support earlier versions can not use that new feature.
> 
> But adding this new feature would not break *any* existing code.
> (show me code that breaks on this)

I meant that such library would need to stick the old behavior or
branch by the version or runtime checking.


----------------------------------------
Feature #15149: extend string format to nil safe
https://bugs.ruby-lang.org/issues/15149#change-74185

* Author: foonlyboy (Eike Dierks)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
I'd like to suggest a new modifier for the string format
(aka the printf-style format string)

## Examples

### Current
~~~
'%s' % nil => ''
'%d' % nil => Exception: TypeError: can't convert nil into Integer
~~~

### Suggestion
~~~
'%&s' % nil => 'nil'
'%&d' % nil => 'nil'
~~~

## Explanation

I suggest to introduce a new modifier for the format strings.
(in the examples above I used the ampersand char: **&**)

That modifier should change the behaviour of string formatting in two ways:
- accept nil as an argument *for all conversion formats*
- display explicit **'nil'** when **nil** is given as an argument

## Rationale

This feature would be most helpful for log messages and printf style debugging

- currently only the %s format accepts nil, but returns an empty string.
- all other formats raise on nil

- when displaying strings, nil args show up indiscernible from empty strings
- when displaying anything else (like %d, %f etc) things just break

## Compatibility

I believe that this new feature would be fully compatible with any existing code.
Up to now the ampersand was not allowed as a modifier and results in an Exception:
~~~
'%&d' % nil => ArgumentError: malformed format string - %&
~~~

As far as I know, the ampersand has not been used in other variations of printf, yet.


## Design

I suggest to use the **&** (ampersand) because that would be in line with the ruby nil safe operator.

I opt for *explicitly* showing 'nil' for nil args (instead of the empty string)





-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>