From: Akinori MUSHA Date: 2009-02-20T14:27:29+09:00 Subject: [ruby-dev:38056] Re: Add option hash support to rb_scan_args() --pgp-sign-Multipart_Fri_Feb_20_13:39:21_2009-1 Content-Type: text/plain; charset=ISO-2022-JP At Fri, 20 Feb 2009 00:10:11 +0900, matz wrote: > 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" writes: > > | rb_scan_args() にoption hash対応を組み込むのはどうでしょうか。 > |実装してみたのでパッチを添付しました。 > | > | argc = rb_scan_args(argc, argv, ":12", &opt, &path, &mode, &perm); > | > |のように頭に : と書くと、必須引数より多くの引数が与えられ、その > |最後の引数がHash(ないし #to_hash で変換可能)な場合に取得されます。 > > [ruby-dev:35379]で中田さんがキーワード対応のパッチをポストし > てくださっています。ハッシュを取り出すのではなく、キーワード > を直接指定するのがキーワード引数らしいかもしれません。  見てみました。仕様案としては十分あると思いますが、その実装では たぶんうまく行きません。必須引数のチェックを行う前に最後の引数が ハッシュなら無条件に取ってしまっているので、オプションハッシュの つもりではなく渡したハッシュがそう受け取られて除去されてしまい、 引数が足りないとエラーにされてしまうケースが出ると思います。  それは私も実際に既存のオプションハッシュを取るメソッドに適用 してみて気づいたことで、私のパッチではまず初めにpostargを含めた 必須引数の数を計算してから、オプションハッシュと考えてよいかを 判断するようにしています。  また、取得したオプションハッシュを(Hash の形で)下請け関数に 投げる例も多く、各キーワードに対応した値の取り出しまでできても、 現状の実装に適用するには改修範囲が大きくなってしまいます。  ということで実際に使うような改修も含めて実装し、テストを行った ものとして検討していただけるとうれしいです。 > 確かになんらかの方法でrb_scan_argsによるキーワード引数の支援 > は欲しいですよねえ。  先のメールでも少し出ましたが、将来的にはメソッド定義の段階 (rb_define_method)でシグネチャを指定するようにすべきでしょうね。 そうすれば、現在各メソッド内で行っている基本的な引数チェックの 手間が省けるほか、その際のエラーメッセージや Method#parameters などのリフレクションAPIの返り値をCで定義したメソッドについても Rubyで定義したメソッドと等しくinformativeかつhuman readableな ものにできます。  rb_scan_args はいずれ消えゆくものと考えて、現状の実装が少し 楽になる程度の改修に留めるのが落としどころではないでしょうか。 キーワード引数の本格的なサポートは、新しい文法や枠組み(API)と ともに導入されるべきだと思います。 -- Akinori MUSHA / http://akinori.org/ --pgp-sign-Multipart_Fri_Feb_20_13:39:21_2009-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEABECAAYFAkmeM/kACgkQkgvvx5/Z4e5LpACfd77ICgsvZqym8kN9zavJZVb4 0q4An2GmaBSneOA7kitHViMTQu44+vWB =5H7N -----END PGP SIGNATURE----- --pgp-sign-Multipart_Fri_Feb_20_13:39:21_2009-1--