2

HTML タグ ('<' と '>') をエスケープするための非常に基本的なメソッドを Smalltalk で必死に作成しようとしています。

これまでのところ、これは私が思いついたものです:

escapeHtml: str
    |tags newString tmpString|
    newString := String new.
    tags := Dictionary new.
    tags at: '<' put: '&lt;'.
    tags at: '>' put: '&gt;'.
    tags keysAndValuesDo:
    [ :k :v |
        tmpString := str copyReplaceAll: k with: v.
        newString := tmpString
    ].
    ^newString
!

tags残念ながら、辞書の最後の項目のみを置き換えるようです。私は何を間違っていますか?また、私は Smalltalk の経験がほとんどないことも指摘しておく必要があります。

選択したインタープリターは「syx」です。

4

1 に答える 1

3

のようなものを作りたかったのだと思います

newString := str

そしてkeysAndValuesDo:ブロックで:

tmpString := newString copyReplaceAll: k with: v.

tmpString現在、1 つのキーのみを置き換えて各キーと値のペアを生成しているためです。に割り当てるよりもnewString。目標を達成するにcopyReplaceAll:は、前の反復で処理された文字列に送信する必要があります。これは、メッセージを に送信することで実行できますnewStringが、最初の反復を機能させるには、 の値をそれに割り当てる必要がありますstr

PS 私はまた、このよりクリーンなバージョンが動作するはずだと思います:

escapeHtml: str
    |tags newString|
    newString := str copy.
    ...
    tags keysAndValuesDo: [ :k :v | newString replaceAll: k with: v ].
    ^newString
于 2012-12-29T21:41:34.137 に答える