Мне нравится ответ @ limc для ситуаций, когда доступен документ HTML DOM.
Мне нравятся ответы @Michele Bosi и @ Paolo для среды документов без HTML DOM, такой как Node.js.
@ Ответ Михаила Боси можно оптимизировать, устраняя необходимость вызывать замену 4 раза одним вызовом замены в сочетании с умной функцией заменителя:
function escape(s) {
return s.replace(/[&"<>]/g, function (c) {
return {
'&': "&",
'"': """,
'<': "<",
'>': ">"
}[c];
});
}
console.log(escape("<b>This is some text.</b>"));
@ Тест диапазона Паоло можно оптимизировать с помощью хорошо выбранного регулярного выражения, а цикл for можно устранить с помощью функции заменителя:
function escape(s) {
return s.replace(/[^0-9A-Za-z ]/g, function(c) {
return "&#" + c.charCodeAt(0) + ";";
} );
}
console.log(escape("<b>This is some text</b>"));
Как указал @Paolo, эта стратегия будет работать для большего количества сценариев.
Это данные, которые должны быть неизменными в Erlang, а не акторы.
Долгоживущие акторы обычно живут в хвостовой рекурсивной функции, аргументы которой служат их состоянием и, безусловно, могут изменение между вызовами.
-module(cache).
-export([start/0, get_c/1, put_c/2, clear/1]).
start() -> register(spawn(fun () -> loop(dict:new()) end), cache).
loop(Dict) -> receive
{get, From, Key} -> From ! {cache_result, Key, dict:fetch(Key, Dict)};
{set, Key, Value} -> NewDict = dict:store(Key, Value, Dict),
loop(NewDict);
%% etc.
end
put_c(Key, Value) -> cache ! {set, Key, Value}
%% etc.
Когда вы вызываете put_c
, «состояние» актера изменяется, даже если все задействованные данные неизменяемы.
Нет причин, по которым кэш и функциональный язык не могут жить вместе. Чтобы быть работоспособным, вам просто нужно подчиниться ограничению, согласно которому при вызове той же функции с теми же аргументами вы получите тот же ответ.
Например: get_data (Query, CacheCriteria)
Просто потому, что get_data использует кеш, не значит, что это не работает. Если вызов get_data с одними и теми же аргументами Query и CacheCriteria всегда возвращает одно и то же значение, язык можно считать функциональным.
Запомните функцию . Кэш - это просто список / словарь и, следовательно, может быть реализован чисто функциональным образом.