# Add option hash support to rb\_scan\_args()

**URL:** <https://www.ruby-forum.com/t/add-option-hash-support-to-rb-scan-args/160689>\
**Category:** Development\
**Created:** [February 18, 2009, 8:34pm UTC](https://www.ruby-forum.com/t/add-option-hash-support-to-rb-scan-args/160689 "2009-02-18T20:34:04Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [February 18, 2009, 8:34pm UTC](https://www.ruby-forum.com/t/add-option-hash-support-to-rb-scan-args/160689/1 "2009-02-18T20:34:04Z")

</div>

ã€€rb\_scan\_args() ã«option hashå¯¾å¿œã‚’çµ„ã¿è¾¼ã‚€ã®ã¯ã©ã†ã§ã—ã‚‡ã†ã‹ã€‚  
å®Ÿè£…ã—ã¦ã¿ãŸã®ã§ãƒ‘ãƒƒãƒã‚’æ·»ä»˜ã—ã¾ã—ãŸã€‚

```
argc = rb_scan_args(argc, argv, ":12", &opt, &path, &mode, &perm);

```

ã®ã‚ˆã†ã«é ­ã« : ã¨æ›¸ãã¨ã€å¿…é ˆå¼•æ•°ã‚ˆã‚Šå¤šãã®å¼•æ•°ãŒä¸Žãˆã‚‰ã‚Œã€ãã®  
æœ€å¾Œã®å¼•æ•°ãŒHash(ãªã„ã— #to\_hash ã§å¤‰æ›å¯èƒ½)ãªå ´åˆã«å–å¾—ã•ã‚Œã¾ã™ã€‚

ã€€ãªãŠã€Rubyã§ã¯

```
def open(path, mode = File::RDONLY, perm = 0666, opt = nil)

```

ã®ã‚ˆã†ã«æ›¸ãã“ã¨ãŒå¤šã„ã§ã™ãŒã€ã“ã‚Œã«ä¾å­˜ã—ã¦ option hash ã‚’ä¸Žãˆ  
ãªã„å ´åˆã«(ç©ºã®Hashã§ãªã) nil ã‚’æ¸¡ã™ç¿’æ…£ãŒå­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®  
ã¨ãã«èª­ã¿æ¨ã¦ã‚‰ã‚ŒãŸ nil ãŒã‚ã£ãŸã‹ã©ã†ã‹ã‚’åˆ¤å®šã§ãã‚‹ã‚ˆã†ã«ã™ã‚‹  
ãŸã‚ã€è¿”ã‚Šå€¤ã¯å…ƒã® argc ãã®ã¾ã¾ã§ã¯ãªãã€ option hash (nil ã®  
å ´åˆã‚’å«ã‚€)ã‚’é™¤ã„ãŸæ•°ã‚’è¿”ã™ã‚ˆã†ã«ã—ã¦ã¿ã¾ã—ãŸã€‚

ã€€: ã‚’æŒ‡å®šã™ã‚‹å ´åˆã¯ä¸Šè¨˜ã®ã‚ˆã†ã« argc ã‚’æ›´æ–°ã™ã‚‹ã®ãŒå®šçŸ³ã¨ãªã‚Š  
ã¾ã™ã€‚(nil ã‚’èª­ã¿æ¨ã¦ã‚‹æ¡ä»¶ã¯ README.EXT\* ã«è¨˜è¼‰ã—ã¾ã—ãŸ)

ã€€ã‚ã‚‹ç¨® option hash ã¯ç‰¹åˆ¥ãªã®ã§å¦¥å½“ãªä»•æ§˜ã ã¨è€ƒãˆã¦ã„ã¾ã™ãŒã€  
ã„ã‹ãŒã§ã—ã‚‡ã†ã‹ã€‚ã„ãšã‚Œã¯ã€ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¼•æ•°ã‚‚ &block åŒæ§˜ã®ç–‘ä¼¼  
å¼•æ•°ã¨ãªã‚Šã€ open(path, \*\*hash) ã®ã‚ˆã†ã«å±•é–‹ã•ã›ã‚‹å½¢ã«ãªã‚Œã°  
ãã®è¾ºã¯ã™ã£ãã‚Šã™ã‚‹ã¨æ€ã„ã¾ã™ã€‚

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [February 19, 2009, 4:11pm UTC](https://www.ruby-forum.com/t/add-option-hash-support-to-rb-scan-args/160689/2 "2009-02-19T16:11:12Z")

</div>

In message “Re: [ruby-dev:38048] Add option hash support to  
rb\_scan\_args()”  
on Thu, 19 Feb 2009 04:33:12 +0900, “Akinori MUSHA”  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|e$B!!e(Brb\_scan\_args() e$B$Ke(Boption hashe$BBP1~$rAH$_9~$`$N$O$I$&$G$7$g$&$+!#e(B  
|e$B\<BAu$7$F$_$?$N$G%Q%C%A$rE:IU$7$^$7$?!#e(B  
|  
| argc = rb\_scan\_args(argc, argv, “:12”, &opt, &path, &mode, &perm);  
|  
|e$B$N$h$&$KF,$Ke(B : e$B$H=q$/$H!“I,?\0z?t$h$jB?$/$N0z?t$,M?$($i$l!”$=$Ne(B  
|e$B:G8e$N0z?t$,e(BHash(e$B$J$$$7e(B #to\_hash e$B$GJQ492DG=e(B)e$B$J\>l9g$K\<hF@$5$l$^$9!#e(B

[ruby-dev:35379]e$B$GCfED$5$s$,%-!\<%o!\<%IBP1~$N%Q%C%A$r%]%9%H$7e(B  
e$B$F$/$@$5$C$F$$$^$9!#%O%C%7%e$r\<h$j=P$9$N$G$O$J$/!"%-!\<%o!\<%Ie(B  
e$B$rD\>@;XDj$9$k$N$,%-!\<%o!\<%I0z?t$i$7$$$+$b$7$l$^$;$s!#e(B

e$B3N$+$K$J$s$i$+$NJ}K!$Ge(Brb\_scan\_argse$B$K$h$k%-!\<%o!\<%I0z?t$N;Y1ge(B  
e$B$OM\_$7$$$G$9$h$M$(!#e(B

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [February 20, 2009, 6:30am UTC](https://www.ruby-forum.com/t/add-option-hash-support-to-rb-scan-args/160689/3 "2009-02-20T06:30:33Z")

</div>

At Fri, 20 Feb 2009 00:10:11 +0900,  
matz wrote:

> [ruby-dev:35379]ã§ä¸­ç”°ã•ã‚“ãŒã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¯¾å¿œã®ãƒ‘ãƒƒãƒã‚’ãƒã‚¹ãƒˆã—  
> ã¦ãã ã•ã£ã¦ã„ã¾ã™ã€‚ãƒãƒƒã‚·ãƒ¥ã‚’å–ã‚Šå‡ºã™ã®ã§ã¯ãªãã€ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰  
> ã‚’ç›´æŽ¥æŒ‡å®šã™ã‚‹ã®ãŒã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¼•æ•°ã‚‰ã—ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ã€‚

ã€€è¦‹ã¦ã¿ã¾ã—ãŸã€‚ä»•æ§˜æ¡ˆã¨ã—ã¦ã¯ååˆ†ã‚ã‚‹ã¨æ€ã„ã¾ã™ãŒã€ãã®å®Ÿè£…ã§ã¯  
ãŸã¶ã‚“ã†ã¾ãè¡Œãã¾ã›ã‚“ã€‚å¿…é ˆå¼•æ•°ã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†å‰ã«æœ€å¾Œã®å¼•æ•°ãŒ  
ãƒãƒƒã‚·ãƒ¥ãªã‚‰ç„¡æ¡ä»¶ã«å–ã£ã¦ã—ã¾ã£ã¦ã„ã‚‹ã®ã§ã€ã‚ªãƒ—ã‚·ãƒ§ãƒ³ãƒãƒƒã‚·ãƒ¥ã®  
ã¤ã‚‚ã‚Šã§ã¯ãªãæ¸¡ã—ãŸãƒãƒƒã‚·ãƒ¥ãŒãã†å—ã‘å–ã‚‰ã‚Œã¦é™¤åŽ»ã•ã‚Œã¦ã—ã¾ã„ã€  
å¼•æ•°ãŒè¶³ã‚Šãªã„ã¨ã‚¨ãƒ©ãƒ¼ã«ã•ã‚Œã¦ã—ã¾ã†ã‚±ãƒ¼ã‚¹ãŒå‡ºã‚‹ã¨æ€ã„ã¾ã™ã€‚

ã€€ãã‚Œã¯ç§ã‚‚å®Ÿéš›ã«æ—¢å­˜ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ãƒãƒƒã‚·ãƒ¥ã‚’å–ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã«é©ç”¨  
ã—ã¦ã¿ã¦æ°—ã¥ã„ãŸã“ã¨ã§ã€ç§ã®ãƒ‘ãƒƒãƒã§ã¯ã¾ãšåˆã‚ã«postargã‚’å«ã‚ãŸ  
å¿…é ˆå¼•æ•°ã®æ•°ã‚’è¨ˆç®—ã—ã¦ã‹ã‚‰ã€ã‚ªãƒ—ã‚·ãƒ§ãƒ³ãƒãƒƒã‚·ãƒ¥ã¨è€ƒãˆã¦ã‚ˆã„ã‹ã‚’  
åˆ¤æ–­ã™ã‚‹ã‚ˆã†ã«ã—ã¦ã„ã¾ã™ã€‚

ã€€ã¾ãŸã€å–å¾—ã—ãŸã‚ªãƒ—ã‚·ãƒ§ãƒ³ãƒãƒƒã‚·ãƒ¥ã‚’(Hash ã®å½¢ã§)ä¸‹è«‹ã‘é–¢æ•°ã«  
æŠ•ã’ã‚‹ä¾‹ã‚‚å¤šãã€å„ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã«å¯¾å¿œã—ãŸå€¤ã®å–ã‚Šå‡ºã—ã¾ã§ã§ãã¦ã‚‚ã€  
ç¾çŠ¶ã®å®Ÿè£…ã«é©ç”¨ã™ã‚‹ã«ã¯æ”¹ä¿®ç¯„å›²ãŒå¤§ãããªã£ã¦ã—ã¾ã„ã¾ã™ã€‚

ã€€ã¨ã„ã†ã“ã¨ã§å®Ÿéš›ã«ä½¿ã†ã‚ˆã†ãªæ”¹ä¿®ã‚‚å«ã‚ã¦å®Ÿè£…ã—ã€ãƒ†ã‚¹ãƒˆã‚’è¡Œã£ãŸ  
ã‚‚ã®ã¨ã—ã¦æ¤œè¨Žã—ã¦ã„ãŸã ã‘ã‚‹ã¨ã†ã‚Œã—ã„ã§ã™ã€‚

> ç¢ºã‹ã«ãªã‚“ã‚‰ã‹ã®æ–¹æ³•ã§rb\_scan\_argsã«ã‚ˆã‚‹ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¼•æ•°ã®æ”¯æ´  
> ã¯æ¬²ã—ã„ã§ã™ã‚ˆã­ãˆã€‚

ã€€å…ˆã®ãƒ¡ãƒ¼ãƒ«ã§ã‚‚å°‘ã—å‡ºã¾ã—ãŸãŒã€å°†æ¥çš„ã«ã¯ãƒ¡ã‚½ãƒƒãƒ‰å®šç¾©ã®æ®µéšŽ  
(rb\_define\_method)ã§ã‚·ã‚°ãƒãƒãƒ£ã‚’æŒ‡å®šã™ã‚‹ã‚ˆã†ã«ã™ã¹ãã§ã—ã‚‡ã†ã­ã€‚  
ãã†ã™ã‚Œã°ã€ç¾åœ¨å„ãƒ¡ã‚½ãƒƒãƒ‰å†…ã§è¡Œã£ã¦ã„ã‚‹åŸºæœ¬çš„ãªå¼•æ•°ãƒã‚§ãƒƒã‚¯ã®  
æ‰‹é–“ãŒçœã‘ã‚‹ã»ã‹ã€ãã®éš›ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚„ Method#parameters  
ãªã©ã®ãƒªãƒ•ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³APIã®è¿”ã‚Šå€¤ã‚’Cã§å®šç¾©ã—ãŸãƒ¡ã‚½ãƒƒãƒ‰ã«ã¤ã„ã¦ã‚‚  
Rubyã§å®šç¾©ã—ãŸãƒ¡ã‚½ãƒƒãƒ‰ã¨ç­‰ã—ãinformativeã‹ã¤human readableãª  
ã‚‚ã®ã«ã§ãã¾ã™ã€‚

ã€€rb\_scan\_args ã¯ã„ãšã‚Œæ¶ˆãˆã‚†ãã‚‚ã®ã¨è€ƒãˆã¦ã€ç¾çŠ¶ã®å®Ÿè£…ãŒå°‘ã—  
æ¥½ã«ãªã‚‹ç¨‹åº¦ã®æ”¹ä¿®ã«ç•™ã‚ã‚‹ã®ãŒè½ã¨ã—ã©ã“ã‚ã§ã¯ãªã„ã§ã—ã‚‡ã†ã‹ã€‚  
ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¼•æ•°ã®æœ¬æ ¼çš„ãªã‚µãƒãƒ¼ãƒˆã¯ã€æ–°ã—ã„æ–‡æ³•ã‚„æž çµ„ã¿(API)ã¨  
ã¨ã‚‚ã«å°Žå…¥ã•ã‚Œã‚‹ã¹ãã ã¨æ€ã„ã¾ã™ã€‚

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [February 20, 2009, 2:33pm UTC](https://www.ruby-forum.com/t/add-option-hash-support-to-rb-scan-args/160689/4 "2009-02-20T14:33:55Z")

</div>

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

2009/02/20 14:27 Akinori MUSHA [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > [ruby-dev:35379]e$B$GCfED$5$s$,%-!\<%o!\<%IBP1~$N%Q%C%A$r%]%9%H$7e(B  
> > e$B$F$/$@$5$C$F$$$^$9!#%O%C%7%e$r\<h$j=P$9$N$G$O$J$/!“%-!\<%o!\<%Ie(B  
> > e$B$rD\>@;XDj$9$k$N$,%-!\<%o!\<%I0z?t$i$7$$$+$b$7$l$^$;$s!#e(B  
> > (snip)  
> > e$B%-!\<%o!\<%I0z?t$NK\3JE\*$J%5%]!\<%H$O!”?7$7$$J8K!$dOHAH$\_e(B(API)e$B$He(B  
> > e$B$H$b$KF3F~$5$l$k$Y$-$@$H;W$$$^$9!#e(B

e$B%-!\<%o!\<%I0z?t$i$7$$0z?t$N\<u$1\<h$jJ}$H$$$&$H!“e(BC API e$B$h$je(B  
Ruby e$B%l%Y%k$NJ}$,5$$K$J$j$^$9!#e(B  
e$B6a$$\>-Mh!”?7$7$$J8K!$rF3F~$9$kM=Dj$d9=A[$O$"$k$N$G$7$g$&$+!#e(B

e$BNc$($P!"$3$s$J46$8$K=q$1$k$H$+!#e(B

def foo(x, y, z, a: “a”, b: “b”, c: “c”)  
p [x, y, z, a, b, c]  
end

foo(1, 2, 3, c: “X”) #=\> [1, 2, 3, “a”, “b”, “X”]

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [February 21, 2009, 4:37pm UTC](https://www.ruby-forum.com/t/add-option-hash-support-to-rb-scan-args/160689/5 "2009-02-21T16:37:15Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:38057] Re: Add option hash support to  
rb\_scan\_args()”  
on Fri, 20 Feb 2009 22:31:25 +0900, Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|e$B%-!\<%o!\<%I0z?t$i$7$$0z?t$N\<u$1\<h$jJ}$H$$$&$H!“e(BC API e$B$h$je(B  
|Ruby e$B%l%Y%k$NJ}$,5$$K$J$j$^$9!#e(B  
|e$B6a$$\>-Mh!”?7$7$$J8K!$rF3F~$9$kM=Dj$d9=A[$O$"$k$N$G$7$g$&$+!#e(B

e$BM=Dj$d9=A[$O$“$j$^$9!#$,!”;~4|$O$J$s$H$b!#e(B2.0e$B$K$J$j$=$&$G$9e(B  
e$B$7!"$=$N;~4|$O40A4$KL$Dj$G$9!#e(B

|e$BNc$($P!"$3$s$J46$8$K=q$1$k$H$+!#e(B  
|  
| def foo(x, y, z, a: “a”, b: “b”, c: “c”)  
| p [x, y, z, a, b, c]  
| end  
|  
| foo(1, 2, 3, c: “X”) #=\> [1, 2, 3, “a”, “b”, “X”]

e$B$H$$$&Iw$K=q$1$k$h$&$K$7$?$$$H;W$C$F$$$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Akinori\_MUSHA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/b782af/32.png) [@Akinori\_MUSHA](https://www.ruby-forum.com/u/Akinori_MUSHA)\
**Post date:** [February 23, 2009, 5:08am UTC](https://www.ruby-forum.com/t/add-option-hash-support-to-rb-scan-args/160689/6 "2009-02-23T05:08:21Z")

</div>

At Sun, 22 Feb 2009 00:36:27 +0900,  
matz wrote:

> äºˆå®šã‚„æ§‹æƒ³ã¯ã‚ã‚Šã¾ã™ã€‚ãŒã€æ™‚æœŸã¯ãªã‚“ã¨ã‚‚ã€‚2.0ã«ãªã‚Šãã†ã§ã™  
> ã—ã€ãã®æ™‚æœŸã¯å®Œå…¨ã«æœªå®šã§ã™ã€‚

[ruby-dev:23533] ã«ææ¡ˆãŒã‚ã‚Šã¾ã™ã­ã€‚æ§‹æ–‡ã‚‚ã•ã‚ŠãªãŒã‚‰ã€C APIã®  
è¨­è¨ˆã‚‚ãªã‹ãªã‹å¤§å¤‰ãã†ã§ã™ã€‚argc/argvã§è¡¨ã›ãªã„ã¨å¤šãã®APIã‚’ç›´ã™  
å¿…è¦ãŒå‡ºã¦ãã‚‹ã¨ã‹ã€å—ã‘æ¸¡ã—ã¯first classãªHashã§ã„ã„ã®ã‹ã¨ã‹ã€  
å¼•æ•°è§£æžã®ãƒ‘ãƒ•ã‚©ãƒ¼ãƒžãƒ³ã‚¹ã¯ã©ã†ã‹ã¨ã‹ã€‚

> |ä¾‹ãˆã°ã€ã“ã‚“ãªæ„Ÿã˜ã«æ›¸ã‘ã‚‹ã¨ã‹ã€‚  
> |  
> | def foo(x, y, z, a: “a”, b: “b”, c: “c”)  
> | p [x, y, z, a, b, c]  
> | end  
> |  
> | foo(1, 2, 3, c: “X”) #=\> [1, 2, 3, “a”, “b”, “X”]
> 
> ã¨ã„ã†é¢¨ã«æ›¸ã‘ã‚‹ã‚ˆã†ã«ã—ãŸã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚

ã€€é †åºãªã—åå‰å¼•æ•°ã¨ã„ã†ã®ã‚‚ã‚ã£ãŸæ–¹ãŒã„ã„ã‚“ã˜ã‚ƒãªã„ã§ã—ã‚‡ã†ã‹ã€‚  
ã§ãªã„ã¨ã€é †åºã«ä¾å­˜ã—ãŸç”¨æ³•ãŒåºƒã¾ã£ã¦å¼•æ•°ã‚’å»ƒæ­¢ã™ã‚‹ã“ã¨ãŒé›£ã—ã  
ãªã‚Šãã†ã§ã™ã€‚

ã€€ã‚ã¨ã¯ã€

- å¿…é ˆå¼•æ•°ã«ã‚‚åå‰ã‚’ä»˜ã‘ãŸã„

- å®Ÿè£…ä¸Šä»®å¼•æ•°åã¯çŸ­ãã—ãŸã„ãŒAPIã¨ã—ã¦ã®åå‰(ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰)ã¯é•·ã  
ã‚ã‹ã‚Šã‚„ã™ãã—ãŸã„

ã¨ã„ã†è¦æ±‚ã‚‚è€ƒæ…®ã—ã€åå‰ã«åŠ ãˆã¦ä»®å¼•æ•°åã‚‚æŒ‡å®šã§ãã‚‹ã‚ˆã†ã«è€ƒãˆã¦  
ã¿ãŸã®ãŒä»¥ä¸‹ã®æ§‹æ–‡ã§ã™ã€‚

# Ruby

def meth(mand1: var1, # leading mandatory argument(s)  
opt1: var2=val, # ordered optional argument(s)  
\*varlen: var3, # variable length arguments  
mand2: var4 # ordered mandatory argument(s)  
opt2:: var5=val # unordered argument(s)  
\*\*var6, # all arguments in hash  
&block)

# …

end

# The var1, var2, var3, var4, var5 parts (formal parameter names)

# above are omittable.

methodname(x, y) # := meth(mand1: x, mand2: y)  
methodname(x, z, y) # := meth(mand1: x, opt1: z, mand2: y)  
methodname(x, y, varlen: l) # := meth(mand1: x, varlen: l, mand2: y)  
methodname(x, y, :varlen =\> l) # ditto

#methodname(x, y, h) # not allowed anymore  
methodname(x, y, \*\*h) # but hash splat is instead

a = [x, y]  
h = { opt1: m, opt2: n }  
methodname(\*a, \*\*h) # := meth(mand1: x, opt1: m, mand2: y,  
opt2: n)

h1 = { mand1: x, mand2: y, opt1: r }  
h2 = { opt1: p, opt2: q }  
methodname(\*\*h1, **h2) # := meth(**(h1.merge(h2)))
