lua вызывают функцию от строки с именем функции

Я нашел, что при добавлении последней измененной метки времени файла на конец 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";
}
23
задан Gregoire 24 November 2009 в 16:31
поделиться

4 ответа

Вызов функции в глобальном пространстве имен (как указано в @ 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
39
ответ дан 29 November 2019 в 00:57
поделиться

Имена не уникальны, может быть много имен функций foo в разных пространствах имен. Но _G ['foo'] - это foo в глобальном пространстве имен.

5
ответ дан 29 November 2019 в 00:57
поделиться

Похоже, вы хотите выполнить 'eval', который поддерживается в Lua следующим образом:

assert(loadstring(x))()

Вы, вероятно, сначала захотите объединить "()" в x, хотя .

2
ответ дан 29 November 2019 в 00:57
поделиться

loadstring здесь не ответ. Для начала вам понадобится return в строке и другие детали, которые я не буду вдаваться в подробности.

THC4k имеет правильную идею; если у вас есть имя функции в переменной x, тогда вам нужен вызов

_G[x](arg1, arg2, ...)
11
ответ дан 29 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: