5
09 ноября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by skf
Общая идея понятна, но мне еще не приходилось так плотно работать с классами в делфи.
Если можешь, разжуй всё попобробнее
Вот рыба. что не понятно, стучи в асю 263-271-807
Код:
type
TCommand = class
private
fCommand: string;
public
procedure Execute(const Params: string); virtual; abstract;
property Command: string read fCommand;
end;//of class
TCommandTable = class
protected
procedure AddCommand(Cmd: TCommand);
function FindCommand(const Cmd: string): TCommand;
procedure DeleteCommands;
public
destructor Destroy; override;
function RegisterCommand(Cmd: TCommand): boolean;
function ExecuteCommand(const Cmd: string; const Params: string): boolean;
end;//of class
//пример команды
TSimpleCommand = class(TCommand)
public
constructor Create;
procedure Execute(const Params: string); override;
end;//of class
procedure TCommandTable.Destroy;
begin
DeleteCommands;
end;
procedure TCommandTable.AddCommand(Cmd: TCommand);
begin
//добавляем новую команду в таблицу
//с Cmd.Command находится идентификатор комманды
//таблицу команд можно организовать как хэш таблицу
//в Делфи есть специальный класс: THashedStringList
end;
function TCommandTable.FindCommand(const Cmd: string): TCommand;
begin
//осуществляем поиск команды Cmd в таблице и возвращаем
//как результат
//если не нашли, то возвращаем nil
end;
procedure TCommandTable.DeleteCommands;
begin
//очищаем таблицу
end;
function TCommandTable.RegisterCommand(Cmd: TCommand): boolean;
begin
if FindCommand(Cmd.Command) then Result:=false
else begin
AddCommand(Cmd);
Result:=true;
end;
end;
function TCommandTable.ExecuteCommand(const Cmd, Params: string): boolean;
var C: TCommand;
begin
c:=FindCommand(Cmd);
if C = nil then Result:=false
else begin
C.Execute(Params);
Result:=true
end;
end;
constructor TSimpleCommand.Create;
begin
fCommand:=’MyCommandName’;
end;
procedure TSimpleCommand.Execute(const Params: string);
begin
//нужно переопределять этот метод
//чтобы придать комманде функциональность
end;
var
CmdTable: TCommandTable;
Cmd: TSimpleCommand;
begin
//создаём таблицу команд
CmdTable:=TCommandTable.Create;
//создаём объект команды
Cmd:=TSimpleCommand.Create;
if not CmdTable.RegisterCommand(Cmd) //регистрация провалилась
then begin
Cmd.Free;
end else begin
CmdTable.ExecuteCommand (‘MyCommandName’, ‘Parameters’ );
end;
end;
Как выполнить функцию если ее имя содержится в переменной типа string
?
Pavel Durmanov
5,6583 золотых знака21 серебряный знак44 бронзовых знака
задан 4 дек 2017 в 14:27
3
Самый безопасный способ это собрать словарь функций:
def func1(text):
return text
def func2():
return ""
functions = {'func1':func1, 'func2':func2}
Соответственно вызов будет functions['ваша строка']()
Избегайте использования eval()
всегда когда это возможно, и в карйнем случае используйте ast.literal_eval()
ответ дан 4 дек 2017 в 15:01
1
Зная имя функции можно получить соответствующий объект функции в заданном пространстве имён.
Если имя это глобальная функция в текущем модуле:
f = globals()["имя"]
Затем самый обычный вызов: f(a, b, c)
Если функция из другого модуля, или это метод класса, объекта, итд то достать функцию можно используя getattr()
:
f = getattr(module, "имя")
Не используйте eval()
, exec()
без необходимости: это не эффективно и может быть не безопасно (если строка из недоверенного ввода).
ответ дан 4 дек 2017 в 19:41
jfsjfs
51.8k11 золотых знаков107 серебряных знаков306 бронзовых знаков
11
Можно поступить так:
In [1]: def example(value):
...: return value ** 2
...:
In [2]: func_name = 'example'
In [3]: eval(func_name)(10)
Out[3]: 100
Подробнее про eval()
можно почитать тут.
ответ дан 4 дек 2017 в 14:38
Pavel DurmanovPavel Durmanov
5,6583 золотых знака21 серебряный знак44 бронзовых знака
4
exec
использует текущие глобальные и локальные пространства имён для выполнения кода:
exec('print(123)')
# 123
ответ дан 4 дек 2017 в 18:19
Игорь ИгорянычИгорь Игоряныч
1,8934 золотых знака12 серебряных знаков27 бронзовых знаков
class A:
def executor(self, fn_name):
getattr(self, fn_name)()
def do_something(self):
print('done')
a = A()
a.executor('do_something')
Всегда старайтесь избегать потенциальную уязвимость в виде выполнения произвольного кода. Ею могут воспользоваться. В данном примере происходит поиск метода по имени и его дальнейший вызов.
ответ дан 31 окт 2021 в 7:03
0
1 Answer
Sorted by:
Reset to default
3
If you have the function name, just call it?
e.g. if you want to call a function called “foo” then just call:
foo();
if you have the name in a variable, then call:
window[funcName]();
Improve this answer
answered Nov 20, 2009 at 21:12
scunliffescunliffe
62.2k25 gold badges125 silver badges161 bronze badges
Add a comment
|
Your Answer
Sign up or log in
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Name
Required, but never shown
By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy
Not the answer you’re looking for? Browse other questions tagged
- javascript
or ask your own question.
Not the answer you’re looking for? Browse other questions tagged
- javascript
or ask your own question.
Chrome Developer Tools rock, но одна вещь, которую они, похоже, не имеют (что я могу найти), – это способ найти определение функции JavaScript. Это было бы очень удобно для меня, потому что я работаю над сайтом, который включает в себя множество внешних JS файлов. Конечно, grep решает это, но в браузере будет намного лучше. Я имею в виду, браузер должен это знать, так почему бы не разоблачить его? Я ожидал чего-то вроде:
- Выберите “Осмотреть элемент” со страницы, в которой выделяется строка на вкладке “Элементы”
- Щелкните правой кнопкой мыши строку и выберите “Перейти к определению функции”
- Корректный script загружается на вкладку “Сценарии”, и он переходит к определению функции
Во-первых, существует ли эта функциональность, и я просто пропустил ее?
И если это не так, я предполагаю, что это исходит от WebKit, но ничего не может найти для запросов к Инструменту разработчика или WebKit Bugzilla.
22 март 2012, в 20:08
Поделиться
Источник
8 ответов
Предположим, что мы ищем функцию с именем foo
:
- (открыть Chrome dev-tools),
- Windows: ctrl + shift + F или macOS:
cmd + optn + F. Это открывает окно для поиска по всем скриптам. - установите флажок “Регулярное выражение”,
- найдите
foos*=s*function
(ищетfoo = function
с любым количеством пробелов между этими тремя токенами), - нажмите на возвращаемый результат.
Другим вариантом определения функции является functions*foos*(
для function foo(
с любым количеством пробелов между этими тремя токенами.
plesiv
06 июнь 2012, в 11:21
Поделиться
Этот приземлился в Chrome на 2012-08-26
Не уверен относительно точной версии, я заметил это в Chrome 24.
Снимок экрана стоит миллион слов:
Я проверяю объект с помощью методов в консоли. Нажатие на “Показать функции определения” приведет меня к месту в исходном коде, где определена функция. Или я могу просто нависать над словом function () {
, чтобы увидеть тело функции во всплывающей подсказке. Вы можете легко проверить всю цепочку прототипов, как это! CDT определенно рок!!!
Надеюсь, вам все это станет полезно!
Dmitry Pashkevich
16 янв. 2013, в 11:27
Поделиться
Вы можете распечатать функцию, оценив ее имя в консоли, например
> unknownFunc
function unknownFunc(unknown) {
alert('unknown seems to be ' + unknown);
}
это не будет работать для встроенных функций, они будут отображать [native code]
вместо исходного кода.
EDIT: это означает, что функция определена в текущей области.
joar
22 март 2012, в 20:34
Поделиться
2016 Обновление: в Chrome версии 51.0.2704.103
Существует ярлык ” Go to member
(указан в settings > shortcut > Text Editor
). Откройте файл, содержащий вашу функцию (в панели sources
DevTools) и нажмите:
ctrl + shift + O
или в OS X:
⌘ + shift + O
Это позволяет перечислить и получить доступ к членам текущего файла.
arthur.sw
10 июль 2016, в 16:23
Поделиться
Другим способом навигации по определению определения функции будет разбиение на отладчик где-нибудь, где вы можете получить доступ к этой функции, и ввести полнофункциональное имя функции в консоли. Это напечатает определение функции в консоли и даст ссылку, которая на клике откроет место расположения скрипта, где определена функция.
Răzvan Flavius Panda
04 дек. 2013, в 14:36
Поделиться
Различные браузеры делают это по-другому.
-
Сначала откройте окно консоли, щелкнув правой кнопкой мыши на странице и выбрав “Осмотреть элемент” или нажав F12.
-
В консоли введите…
-
Firefox
functionName.toSource()
-
Chrome
functionName
-
Deepak Dixit
20 нояб. 2015, в 06:38
Поделиться
Я считаю, что самый быстрый способ найти глобальную функцию – это просто:
- Выберите вкладку ” Источники “.
- В окне ” Наблюдение” нажмите + и введите окно
- Ваши глобальные ссылки на функции перечислены первыми, в алфавитном порядке.
- Щелкните правой кнопкой мыши интересующую вас функцию.
- Во всплывающем меню выберите ” Показать определение функции”.
- Панель исходного кода переключается на это определение функции.
Chris Robinson
25 дек. 2017, в 13:13
Поделиться
в консоли Chrome:
debug(MyFunction)
MyFunction
Igor Krupitsky
07 дек. 2018, в 16:03
Поделиться
Ещё вопросы
- 0JS не работает на ПК, но работает на JSFIddle
- 0ЗАГРУЗКА ДАННЫХ INFILE с удаленного сервера при получении ошибки
- 0ng-repeat возвращает TypeError: невозможно прочитать свойство ‘insertBefore’ из null
- 0ASN1C компиляция
- 1Приложение Android закрывается при добавлении класса-оболочки в манифест
- 1странная ошибка в java отражении (обработка)
- 1Как получить доступ к DOM в потоке или подпроцессе Python
- 0проблема asp.net с datasrc и datafld для получения информации XML
- 1React Native подписанный apk завершается неудачно после обновления версии средства сборки gradle до 3.2.1
- 0выбрать элемент окна выбора по номеру элемента в jQuery
- 0Как мне очистить эти вложенные циклы?
- 0Mvc: вызов метода контроллера и использование значения, выбранного из выпадающего списка в этом методе
- 0Цикл объектов в массиве JS
- 0Исправление синтаксической ошибки переменной селектора jQuery
- 1Громкость голоса, полученного с микрофона, произвольно уменьшается (Android, OpenSLES)
- 0Я пытаюсь заполнить поле со списком в front-end значением поля из базы данных
- 0Добавление большого количества html и php контента как переменной PHP
- 0Div точная высота как высота окна
- 0Отслеживание прогресса пользователей во время отправки теста / формы
- 1Компаратор работает для моего ArrayList, но код выглядит неправильно?
- 0показать отслеживаемый объект в видео с помощью OpenGL
- 0GLUT взаимодействие с мышью
- 0MySQL на проблемах чувствительности к регистру Ubuntu
- 0Отличная условная блокировка в 2-х функциях
- 1Получить IP-адрес из последней строки файла журнала, используя Regex
- 0удалить дубликаты на левой таблице, сохраняя дубликаты на правой таблице SELECT JOIN
- 1Скрыть StatusBar в Trusted Web Activity
- 0Эффективный способ перенаправления страниц с использованием угловых JS
- 0Как я могу использовать кнопку WindowsFormApplication для переключения между двумя приложениями Windows (заставить их наверх)?
- 0AngularJS просмотры нарушены после перенаправления oauth
- 0Авто-увеличение при изменении ориентации в iOS 7
- 1WP8 BUG: несоответствие идентификатора подписи кода при установке из хаба компании
- 1Не удалось создать сборку. Ссылочная сборка “Google.Apis” не имеет строгого имени.
- 1python – замена фрагмента из строки [duplicate]
- 0Цвет наложения JQuery FancyBox
- 0Вставить несколько строк в laravel с полезной нагрузкой JSON
- 1java.lang.NullPointerException: попытка чтения из поля ‘android.view.View android.support.v7.widget.RecyclerView $ ViewHolder.itemView’
- 0Обновление разделов страницы после замены фильтра
- 1Самый простой способ добавить политику конфиденциальности с моим приложением для Android
- 1Есть ли Java-эквивалент службы Windows
- 1Java Swing: включение / отключение компонентов определенного типа
- 1Как остановить масштабирование навигационной панели инструментов Matplotlib при обновлении графика?
- 0JQuery Searchbox IE9 проблема
- 1Могу ли я реализовать трехслойную архитектуру при создании диаграммы классов UML?
- 1Как читать ObjectInputStream без знания того, что было сериализовано?
- 1dc.js Вид по умолчанию для таблицы строк отсортирован и не переупорядочивается при нажатии
- 2Android – Как получить координаты персонажа в текстовом представлении
- 0Не удается сбросить форму с помощью ‘$ setPristine’
- 1SoftKeyboard накладывается на EditText – ConstraintLayout
- 0Получить значения из QDialog
Многие новички задаются вопросом типа:
- “Как вызвать функцию по ее имени“
- “Как вызвать функцию если ее имя хранится в переменной“
- Ну, и тому подобные вопросы 🙂
Возьмем пример задачи:
var name = 'myFunc';
function myFunc(text) {
alert(text);
}
И так, у нас есть функция под именем myFunc и переменная name которая содержит в себе имя функции.
Как можно вызвать функцию, используя переменную ?
Есть 3 варианта решения этой задачи:
- Использовать объект window
- Использовать функцию eval()
- Создать свой объект, в котором описать функцию.
1) Использовать объект window
На мой взгляд самый подходящий вариант.
Делается следующим образом:
window[funcName](params);
funcName – имя вызываемой функции
params – параметры передаваемые функции.
Нашу задачу можно решить следующим образом:
var name = 'myFunc';
function myFunc(text) {
alert(text);
}
window[name]('bla bla bla'); //Вызываем функцию myFunc и передаем в качестве параметра текст "bla bla bla"
Вот еще примеры:
window['alert']('bla bla bla'); // Выведется Alert с текстом "bla bla bla"
var myFunc = 'myAlert';
function myAlert(text) {
alert(text);
}
window[myFunc]('bla bla bla'); // Выведется Alert с текстом "bla bla bla"
2) Использовать функцию eval()
С помощью функции eval() можно выполнить какую ту часть кода, в том числе и вызвать функцию.
Пример:
function myAlert(text) {
alert(text);
}
eval('myAlert("bla bla bla");');
Нашу задачу можно решить так:
var name = 'myFunc';
function myFunc(text) {
alert(text);
}
eval(name+'("bla bla bla");'); //Вызываем функцию myFunc и передаем в качестве параметра текст "bla bla bla"
Но не злоупотребляйте данной функции так как неправильное использование eval():
- Открывает ваш код для Инъекций
- Отладка может быть более сложная (без номера строк)
- Код выполняется медленее
3) Создать свой объект, в котором описать функцию
И так, как вариант мы можем создать свой объект и из него вызвать функцию, по сути получится тоже самое как и использование объекта window.
Пример:
var obj = {
firstFunc: function(text) {
alert('first func: '+text);
},
secondFunc: function(text) {
alert('second func: '+text);
}
}
obj['firstFunc']("bla bla bla"); //Вызываем функцию firstFunc
obj['secondFunc']("bla bla bla"); //Вызываем функцию secondFunc
var name = 'first';
obj[name+'Func']("bla bla bla"); //Вызываем функцию firstFunc
Нашу задачу можно решить следующим образом:
var name = 'myFunc';
obj = { // Описываем наш объект
myFunc: function(text) { //Описываем нашу функцию в объекте
alert(text);
}
}
obj[name]("bla bla bla"); //Вызываем функцию myFunc из объекта obj и передаем в качестве параметра текст "bla bla bla"
Заключение
Ну вот примерно и все 🙂
По моему мнению самый оптимальный вариант это использовать объект window хотя редко бывают ситуации когда имя функции берется из переменной, по сути вам даже стоит избегать таких ситуации и искать другие решения.