# \[Feature:1.9\] name referencing in sprintf

**URL:** <https://www.ruby-forum.com/t/feature-1-9-name-referencing-in-sprintf/145931>\
**Category:** Development\
**Created:** [August 15, 2008, 6:11am UTC](https://www.ruby-forum.com/t/feature-1-9-name-referencing-in-sprintf/145931 "2008-08-15T06:11:26Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [August 15, 2008, 6:11am UTC](https://www.ruby-forum.com/t/feature-1-9-name-referencing-in-sprintf/145931/1 "2008-08-15T06:11:26Z")

</div>

e$B1sF#$G$9!#e(B

1.9 e$B$G$O@55,I=8=$GL\>A0$r;H$C$?;2\>H$,$G$-$k$N$G!"e(Bsprintf e$B$G$be(B  
e$BL\>A0$r;H$C$?;2\>H$,$G$-$k$HJXMx$8$c$J$$$G$7$g$&$+!#e(B

$ ./ruby -e ‘puts “%d : %f” % { :foo =\> 1, :bar =\> 2 }’  
1 : 2.000000

$ ./ruby -e ‘printf("%d : %f\n", :foo =\> 1, :bar =\> 2)’  
1 : 2.000000

e$B$"$^$j%F%9%H$7$F$$$^$;$s$,!"$?$?$-Bf$N\<BAu$G$9!#e(B

# Index: sprintf.c

— sprintf.c (revision 18638)  
+++ sprintf.c (working copy)  
@@ -103,18 +103,28 @@  
} while (0)

#define GETARG() (nextvalue != Qundef ? nextvalue : \

- posarg \< 0 ? \

- posarg == -1 ?   
(rb\_raise(rb\_eArgError, “unnumbered(%d) mixed with numbered”,  
nextarg), 0) : \
- posarg == -2 ? \
- (rb\_raise(rb\_eArgError, “unnumbered(%d) mixed with named”,  
nextarg), 0) :   
(posarg = nextarg++, GETNTHARG(posarg)))

#define GETPOSARG(n) (posarg \> 0 ?   
(rb\_raise(rb\_eArgError, “numbered(%d) after unnumbered(%d)”, n,  
posarg), 0) : \

- posarg == -2 ? \
- (rb\_raise(rb\_eArgError, “numbered(%d) after named”, n), 0) :   
((n \< 1) ? (rb\_raise(rb\_eArgError, “invalid index - %d$”, n), 0) :  
  
(posarg = -1, GETNTHARG(n))))

#define GETNTHARG(nth)   
((nth \>= argc) ? (rb\_raise(rb\_eArgError, “too few arguments”), 0)  
: argv[nth])

+#define GETNAMEARG(id) (posarg \> 0 ? \

- (rb\_raise(rb\_eArgError, “named after unnumbered(%d)”, posarg), 0) :  
\
- posarg == -1 ? \
- (rb\_raise(rb\_eArgError, “named after numbered”), 0) : \
- rb\_hash\_aref(get\_hash(&hash, argc, argv), id))
- 

#define GETNUM(n, val)   
for (; p \< end && rb\_enc\_isdigit(\*p, enc); p++) {   
int next\_n = 10 \* n + (\*p - ‘0’);   
@@ -141,7 +151,22 @@  
val = NUM2INT(tmp);   
} while (0)

+static VALUE  
+get\_hash(volatile VALUE \*hash, int argc, const VALUE \*argv)  
+{

- VALUE tmp;

- if (\*hash != Qundef) return \*hash;

- if (argc != 2) {

- rb\_raise(rb\_eArgError, “one hash required”);

- }

- tmp = rb\_check\_convert\_type(argv[1], T\_HASH, “Hash”, “to\_hash”);

- if (NIL\_P(tmp)) {

- rb\_raise(rb\_eArgError, “one hash required”);

- }

- return (\*hash = tmp);  
+}

- 

/\*

- call-seq:
- 

```
format(format_string [, arguments...] ) => string

```

@@ -412,6 +437,7 @@  
VALUE nextvalue;  
VALUE tmp;  
VALUE str;

- volatile VALUE hash = Qundef;

#define CHECK\_FOR\_WIDTH(f)   
if ((f) & FWIDTH) {   
@@ -513,6 +539,22 @@  
flags |= FWIDTH;  
goto retry;

- case ‘\<’:
- 

```
 {

```

- const char \*start = p;
- ID id;
- for (; p \< end && \*p != ‘\>’; ) {
- 

```
   p += rb_enc_mbclen(p, end, enc);

```

- }
- if (p \>= end) {
- 

```
   rb_raise(rb_eArgError, "malformed name - unmatched 

```

parenthesis");

- }
- id = rb\_intern3(start + 1, p - start - 1, enc);
- nextvalue = GETNAMEARG(ID2SYM(id));
- p++;
- goto retry;
- 

```
 }

```

- case ‘\*’:  
CHECK\_FOR\_WIDTH(flags);  
flags |= FWIDTH;

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [August 15, 2008, 7:23am UTC](https://www.ruby-forum.com/t/feature-1-9-name-referencing-in-sprintf/145931/2 "2008-08-15T07:23:54Z")

</div>

On Fri, 15 Aug 2008 13:08:12 +0900  
In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[[ruby-dev:35851] [Feature:1.9] name referencing in sprintf]  
“Yusuke ENDOH” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 1.9 e$B$G$O@55,I=8=$GL\>A0$r;H$C$?;2\>H$,$G$-$k$N$G!"e(Bsprintf e$B$G$be(B  
> e$BL\>A0$r;H$C$?;2\>H$,$G$-$k$HJXMx$8$c$J$$$G$7$g$&$+!#e(B
> 
> $ ./ruby -e ‘puts “%d : %f” % { :foo =\> 1, :bar =\> 2 }’

Ruby-GetText e$B$Ge(B %{foo}  
e$B$H$$$&$N$r;H$C$F$$$k$N$G!“9g$o$;$F$”$k$H4r$7$$?Me(B  
e$B$,B?$$$+$H!#=q\<0;XDj$O$G$-$J$$$N$G$9$,!#e(B

# {} e$B$O=q\<0;XDjL5$7HG!"e(B\<\> e$B$OM-$jHGe(B e$B$K$9$k$H$+!)e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [August 15, 2008, 9:32am UTC](https://www.ruby-forum.com/t/feature-1-9-name-referencing-in-sprintf/145931/3 "2008-08-15T09:32:07Z")

</div>

e$B$J$+$@$G$9!#e(B

At Fri, 15 Aug 2008 14:20:15 +0900,  
Tietew wrote in [ruby-dev:35852]:

> On Fri, 15 Aug 2008 13:08:12 +0900  
> In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> [[ruby-dev:35851] [Feature:1.9] name referencing in sprintf]  
> “Yusuke ENDOH” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > 1.9 e$B$G$O@55,I=8=$GL\>A0$r;H$C$?;2\>H$,$G$-$k$N$G!"e(Bsprintf e$B$G$be(B  
> > e$BL\>A0$r;H$C$?;2\>H$,$G$-$k$HJXMx$8$c$J$$$G$7$g$&$+!#e(B
> > 
> > $ ./ruby -e ‘puts “%d : %f” % { :foo =\> 1, :bar =\> 2 }’

[ruby-dev:16351]e$B$G$Oe(BPythone$B$HF1$8$/e(B %(foo)d  
e$B$H$7$F$$$^$7$?!#e(B

> Ruby-GetText e$B$Ge(B %{foo} e$B$H$$$&$N$r;H$C$F$$$k$N$G!“9g$o$;$F$”$k$H4r$7$$?Me(B  
> e$B$,B?$$$+$H!#=q\<0;XDj$O$G$-$J$$$N$G$9$,!#e(B
> 
> # {} e$B$O=q\<0;XDjL5$7HG!"e(B\<\> e$B$OM-$jHGe(B e$B$K$9$k$H$+!)e(B

Ruby-GetTexte$B$N\<BAu$r3NG’$7$F$$$J$$$N$G$9$,!“e(B%{}e$B0J30$N$b$N$,$”$Ce(B  
e$B$F$bBg\>fIW$J$N$G$7$g$&$+!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [August 15, 2008, 9:46am UTC](https://www.ruby-forum.com/t/feature-1-9-name-referencing-in-sprintf/145931/4 "2008-08-15T09:46:44Z")

</div>

On Fri, 15 Aug 2008 16:28:56 +0900  
In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
[[ruby-dev:35853] Re: [Feature:1.9] name referencing in sprintf]  
Nobuyoshi N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > Ruby-GetText e$B$Ge(B %{foo} e$B$H$$$&$N$r;H$C$F$$$k$N$G!“9g$o$;$F$”$k$H4r$7$$?Me(B  
> > e$B$,B?$$$+$H!#=q\<0;XDj$O$G$-$J$$$N$G$9$,!#e(B
> > 
> > # {} e$B$O=q\<0;XDjL5$7HG!"e(B\<\> e$B$OM-$jHGe(B e$B$K$9$k$H$+!)e(B
> 
> Ruby-GetTexte$B$N\<BAu$r3NG’$7$F$$$J$$$N$G$9$,!“e(B%{}e$B0J30$N$b$N$,$”$Ce(B  
> e$B$F$bBg\>fIW$J$N$G$7$g$&$+!#e(B

Ruby-GetText e$B$Oe(B String#% e$B$@$1$r=q$-49$($F$$$F!“1&JU$,e(B Hash  
e$B$@$C$?$ie(B %{…}  
e$B$rCV49$7!”$5$b$J$1$l$P85$N$b$N$r8F$s$G$$$^$9!#e(B

e$B$3$&$$$&$U$&$K$J$j$^$9e(B:  
“%d %{foo}” % { :foo =\> ‘bar’ } # =\> “%d bar”  
“%d %{foo}” % 123 # =\> “123 %{foo}”

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [August 16, 2008, 12:20pm UTC](https://www.ruby-forum.com/t/feature-1-9-name-referencing-in-sprintf/145931/5 "2008-08-16T12:20:12Z")

</div>

e$B@\>;3OB9-$G$9!#e(B

At Fri, 15 Aug 2008 13:08:12 +0900,  
Yusuke ENDOH wrote:

> e$B$"$^$j%F%9%H$7$F$$$^$;$s$,!"$?$?$-Bf$N\<BAu$G$9!#e(B

e$B@55,I=8=$NNc$r=P$9$N$J$i!"e(BHashe$B8BDj$G$O$J$/e(B[]e$B%a%=%C%I$r8F$s$@J}$,e(B  
e$BJXMx$J$N$G$O$J$$$G$7$g$&$+!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 30, 2008, 10:07am UTC](https://www.ruby-forum.com/t/feature-1-9-name-referencing-in-sprintf/145931/6 "2008-09-30T10:07:38Z")

</div>

e$B%A%1%C%He(B #442 e$B$,99?7$5$l$^$7$?!#e(B (by Yukihiro M.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B  
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

## Applied in changeset r19641.

[http://redmine.ruby-lang.org/issues/show/442](http://redmine.ruby-lang.org/issues/show/442)
