Я нашел, что при добавлении последней измененной метки времени файла на конец URL, браузер запросит файлы, когда это будет изменено. Например, в PHP:
function urlmtime($url) {
$parsed_url = parse_url($url);
$path = $parsed_url['path'];
if ($path[0] == "/") {
$filename = $_SERVER['DOCUMENT_ROOT'] . "/" . $path;
} else {
$filename = $path;
}
if (!file_exists($filename)) {
// If not a file then use the current time
$lastModified = date('YmdHis');
} else {
$lastModified = date('YmdHis', filemtime($filename));
}
if (strpos($url, '?') === false) {
$url .= '?ts=' . $lastModified;
} else {
$url .= '&ts=' . $lastModified;
}
return $url;
}
function include_css($css_url, $media='all') {
// According to Yahoo, using link allows for progressive
// rendering in IE where as @import url($css_url) does not
echo '<link rel="stylesheet" type="text/css" media="' .
$media . '" href="' . urlmtime($css_url) . '">'."\n";
}
function include_javascript($javascript_url) {
echo '<script type="text/javascript" src="' . urlmtime($javascript_url) .
'"></script>'."\n";
}
Вызов функции в глобальном пространстве имен (как указано в @ THC4k) легко сделать и не требует loadstring ()
.
x='foo'
_G[x]() -- calls foo from the global namespace
Вы потребуется использовать loadstring ()
(или пройтись по каждой таблице), если функция находится в другой таблице, например if x = 'math.sqrt'
.
If loadstring ()
, вы бы хотели не только добавить круглые скобки с эллипсом (...)
, чтобы разрешить параметры, но также добавить return
вперед.
x='math.sqrt'
print(assert(loadstring('return '..x..'(...)'))(25)) --> 5
] или пройдите по таблицам:
function findfunction(x)
assert(type(x) == "string")
local f=_G
for v in x:gmatch("[^%.]+") do
if type(f) ~= "table" then
return nil, "looking for '"..v.."' expected table, not "..type(f)
end
f=f[v]
end
if type(f) == "function" then
return f
else
return nil, "expected function, not "..type(f)
end
end
x='math.sqrt'
print(assert(findfunction(x))(121)) -->11
Имена не уникальны, может быть много имен функций foo в разных пространствах имен. Но _G ['foo']
- это foo
в глобальном пространстве имен.
Похоже, вы хотите выполнить 'eval', который поддерживается в Lua следующим образом:
assert(loadstring(x))()
Вы, вероятно, сначала захотите объединить "()" в x, хотя .
loadstring
здесь не ответ. Для начала вам понадобится return
в строке и другие детали, которые я не буду вдаваться в подробности.
THC4k имеет правильную идею; если у вас есть имя функции в переменной x, тогда вам нужен вызов
_G[x](arg1, arg2, ...)