# \[Feature:1.9\] rb\_scan\_args() for keyword arguments

**URL:** <https://www.ruby-forum.com/t/feature-1-9-rb-scan-args-for-keyword-arguments/142294>\
**Category:** Development\
**Created:** [July 6, 2008, 9:21am UTC](https://www.ruby-forum.com/t/feature-1-9-rb-scan-args-for-keyword-arguments/142294 "2008-07-06T09:21:56Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![nobu](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/e9c0ed/32.png) [@nobu](https://www.ruby-forum.com/u/nobu)\
**Post date:** [July 6, 2008, 9:21am UTC](https://www.ruby-forum.com/t/feature-1-9-rb-scan-args-for-keyword-arguments/142294/1 "2008-07-06T09:21:56Z")

</div>

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

rb\_scan\_args()e$B$G%-!\<%o!\<%I0z?t$KBP1~$9$k%Q%C%A$rH/7!$7$^$7$?!#e(B

rb\_scan\_args(argc, argv, “11:foo”, &mandatory, &optional, &foo)  
e$B$H$+e(B  
rb\_scan\_args(argc, argv, “11::”, &mandatory, &optional,  
rb\_intern(“foo”), &foo, (ID)0)  
e$B$H$+=q$1$k$h$&$K$J$k$O$:$@$C$?$H;W$$$^$9!#e(B

# Index: class.c

— class.c (revision 17903)  
+++ class.c (working copy)  
@@ -871,4 +871,5 @@ rb\_scan\_args(int argc, const VALUE \*argv  
const char \*p = fmt;  
VALUE \*var;

- VALUE opt = 0;  
va\_list vargs;

@@ -876,4 +877,13 @@ rb\_scan\_args(int argc, const VALUE \*argv

```
 if (*p == '*') goto rest_arg;

```

- if (strchr(fmt, ‘:’)) {

- if (argc \> 0 && TYPE(opt = argv[argc-1]) == T\_HASH) {

- 

```
 --argc;

```

- }

- else {

- 

```
 opt = 0;

```

- }

- if (\*p == ‘:’) goto keyword;

- }

- 

```
 if (argc > i) {

```

- if (var) \*var = argv[i];
- 

```
 }

```

- 

```
 else {

```

- if (var) \*var = Qnil;

- 

```
 if (var) {

```

- \*var = argc \> i ? argv[i] : Qnil;  
}  
}  
@@ -905,5 +912,32 @@ rb\_scan\_args(int argc, const VALUE \*argv  
}

- if(_p == '_’) {

- keyword:
- if (\*p == ‘:’) {
- if (p[1] == ‘:’) {
- 

```
 ID name;

```

- 

```
 while ((name = va_arg(vargs, ID)) != 0) {

```

- var = va\_arg(vargs, VALUE\*);
- if (var) {
- 

```
   *var = opt ? rb_hash_lookup(opt, name) : Qnil;

```

- }
- 

```
 }

```

- }
- else {
- 

```
 do {

```

- const char \*beg = ++p;
- if (\*p != ‘\_’ && !ISALPHA(\*p)) goto error;
- while (\*p == ‘\_’ || ISALNUM(\*p)) p++;
- if (_p && !strchr(":_&", \*p)) goto error;
- var = va\_arg(vargs, VALUE\*);
- if (var) {
- 

```
   *var = opt ?

```

- 

```
 rb_hash_lookup(opt, rb_intern2(beg, p - beg)) :

```

- 

```
 Qnil;

```

- }
- 

```
 } while (*p == ':');

```

- }
- }
- 
- if (_p == '_’) {  
rest\_arg:  
var = va\_arg(vargs, VALUE\*);
