3

以下のポート仕様では、URL を解析してユーザー、パス、ホスト、およびパスを決定しようとしています。ユーザー/パスの値はオプションですが、存在しない場合はそれぞれにデフォルト値を設定したいと思います。

しかし、user/pass が存在しない場合、user/passはオブジェクトから省略されていport/specます。これはなぜでしょうか?

>> read sch://foo/bar.r
PORT/SPEC is an object of value: 
   title           string!   "Wee Scheme" 
   scheme          word!     sch 
   ref             url!      sch://foo/bar.r 
   path            string!   "/bar.r" 
   host            string!   "foo" 

>> read sch://foo:bar@foo/bar.r
PORT/SPEC is an object of value: 
   title           string!   "Wee Scheme" 
   scheme          word!     sch 
   ref             url!      sch://foo:bar@foo/bar.r 
   path            string!   "/bar.r" 
   pass            string!   "bar" 
   user            string!   "foo" 
   host            string!   "foo"

また、この質問の草案を作成する際に、スキームに誤りがあり、パース ルールをportではなく にバインドしましたport/spec—how are the values then set in the port/specobject?

仕様:

sys/make-scheme [
    name: 'sch
    title: "Wee Scheme"
    actor: [
        read: func [port][
            parse port/spec/ref use [chars][
                chars: charset [#"a" - #"z" #"A" - #"Z" #"0" - #"9" "-_!+%.,"]

                bind [
                    "sch://" [
                        copy user some chars #":"
                        copy pass some chars #"@"
                        | (user: 'mince pass: 'tatties)
                    ]
                    copy host some chars
                    copy path [some [#"/" any chars]]
                    end
                ] port
            ]
            ? port/spec
        ]
    ]
]
4

2 に答える 2

4

make-scheme https://github.com/rebol/r3/blob/master/src/mezz/sys-ports.r#L254は、ユーザーを持たないデフォルトの仕様 system/standard/port-spec-net を使用し、合格。

>> system/standard/port-spec-net
== make object! [
    title: none
    scheme: none
    ref: none
    path: none
    host: none
    port-id: 80
]

したがって、仕様に渡されなくてもユーザーとパスが必要な場合は、次のような独自の仕様を作成する必要がありますhttps://github.com/rebol/r3/blob/master/src/mezz/prot-http.r #L417そしてそれらをそこに設定します。

于 2013-03-16T04:21:40.777 に答える
3

多くのポートスキームには概念としてユーザーやパスワードすら含まれていないため、標準のポート仕様にはuserまたはフィールドはありません。ユーザーが必要で毎回合格する必要passがある場合は、Grahamが提案したように、ポートを構築するときに独自のポート仕様のプロトタイプを使用してください。

ただし、selectスキームのポート仕様での使用を検討することもできます。R3の関数はオブジェクトでも機能し、選択している単語が現在オブジェクトで定義されていない場合にselectのみ戻ります。noneこれは、R3全体で使用できる便利なショートカットです。

スペックオブジェクトのプロトタイプにすべてのオプションの単語を含める必要があるとは思わないでください。仕様のプロトタイプに含めるすべての単語は、適用されるかどうかに関係なく、結果のすべての仕様に追加されます。欠落している単語のデフォルト値がある場合は、それらのデフォルトをプロトタイプ仕様に追加することもできますが、デフォルトのシリーズ値は変更される可能性があるため注意してください。userただし、やのように本当にオプションの単語の場合は、passメモリオーバーヘッドを節約するためにプロトタイプから除外して、select代わりに使用することを検討してください。

于 2013-03-16T04:38:21.580 に答える