Перейти к содержимому

Лидеры


Популярный контент

Показан контент с высокой репутацией 18.11.2019 в Сообщения

  1. 1 балл
    Про лучший способ использования Git я не скажу, но если проблема только в этом: то я обычно веду всю разработку проекта в одной папке, а в папки жёстких дисков кидаю лишь символические ссылки на нужные файлы, находящиеся в папке проекта.
  2. 1 балл
    В особо сложных программах бывает необходимость сократить вызов функции от некоторого числа аргументов, зафиксировав значение некоторых (или всех) из них, если другие значения в этом контексте использоваться будут редко. Подобные штуки есть в куче языков. В стандартную библиотеку C++0x для этого (в том числе) ввели std::function, в Haxe и Haskell это просто часть языка. Многие считают такой приём чертой функционального стиля программирования, который я ещё не освоил, но стараюсь. Работает это очень просто и код очень короткий. Берём функцию, указываем ей несколько первых аргументов - получаем функцию, которой надо указать только оставшиеся (если таковые есть): function bind(f, ...) local higherArg = arg return function(...) return f( unpack(higherArg), unpack(arg) ) end end Т. е. эта штука возвращает функцию, которая возвращает результат указанной вами функции, аргументами к которой выступает то, что вы указали при привязке (вызове bind), а затем то, что вы указали при вызове возвращённой из привязки функцией. Ещё ничего не закипело от обилия функций? Привожу пример. Можете посмотреть сразу в интерпретаторе Lua. Это не слишком практичный пример, поэтому вот кое-что поинтереснее. Допустим, вы хотите получить таблицу, содержащую путь к файлу и ряд команд, которые с ним можно выполнить без указания лишних данных. Примерно как у обычного объекта. Да, можно собрать класс "файл", но это не единственный способ, и у него свои недостатки. С биндом подобная штука записывается очень коротко: filename = "file" file = { filename = filename, run = bind(shell.run, filename), -- Можно смешивать функции из разных API delete = bind(fs.delete, filename) -- вообще без проблем } -- И эти операции можно вызывать без аргументов, забыв про API: file.run() -- Запускаем файл file.delete() -- Стираем файл Конечно, в случае больших задач "нормальный" класс (с вызовами методов через двоеточие) предпочтительнее, поскольку даёт больше контроля над возвращаемыми значениями и обработкой возможных ошибок. Но если это не требуется, можно сэкономить время с помощью привязки. Есть и другие способы применения, на которые вы, может быть, наткнётесь сами. Чаще всего это способ сэкономить на объёме кода, уложив повторяющийся аргумент. Компактнее, чем это делает вынесение в переменную, хотя потребляет несколько больше оперативной памяти, ведь такие "методы" будут создаваться каждый раз на каждую привязку. Осторожней с этим. Это часть более крупной библиотеки, которую я пишу вот тут, на гитхабе. Потом перейду к каркасику для приложений, состоящих из менюшек (что покрывает на удивление много случаев). Получить эту штуку на ComputerCraft'овский комп можно вот так: openp/github get D-side/luaCC/master/bind.lua bind Такие дела. Развлекайтесь! Надеюсь, скоро принесу ещё каких-нибудь плюшек.
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...