2

我拼命尝试在 Smalltalk 中编写一个非常基本的方法来转义 HTML 标记('<' 和 '>')。

到目前为止,这就是我想出的:

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为每个键/值对生成一个,只替换一个键。比您将其分配给newString. 为了实现您的目标,您应该发送copyReplaceAll:到在先前迭代中处理的字符串。这可以通过向 a 发送消息来完成newString,但是要使第一次迭代起作用,您应该为其分配一个值 an 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 回答