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

Про скобочки

Fingercomp

156 просмотров

Продолжу рассказывать про знаки препинания. В этом посте — 3 разных истории про пару круглых скобок.

 

1. Вызовы функций

Если функция вызывается с одним аргументом — строковым или табличным литералом, то скобочки необязательны.

local function identity(x)
  return x
end

print(identity "test" == "test")
print(table.unpack(identity {"test"}) == "test")

Это чисто синтаксическая фишка, которая никак не влияет на исполнение кода. Очень удобно, чтобы вызвать функцию и передать ей таблицу с опциями.

local logger = getLogger {
  name = "main",
  level = "info",
  output = {stdout},
}

 

Если несколько литералов так разместить подряд, получится ряд последовательных вызовов:

myFunc "hello" "world" {"how do you do"}
-- myFunc("hello")("world")({"how do you do"})

Используя эту фичу, можно воплотить всякие норкоманские вещи. Как вам вот такой форматтер с интерполяцией?

local myVar = 42

print(format "myVar = " {myVar} ", and I'm running " {_VERSION})
--> myVar = 42, and I'm running Lua 5.3

 

 

2. Ещё про литералы

У всех строк есть метатаблица, у которой __index = string. Это значит, что можно вместо string.gsub(str, ...) писать str.gsub(str, ...), или str:gsub(...). Очень удобно, особенно последнее.

 

Но вот просто так заменить str литералом нельзя. "test":gsub(...) — синтаксически неправильный код. Выручат скобки вокруг литерала: ("test"):gsub(...). Постоянно этим пользуюсь.

 

Та же ситуация, если мы хотим проиндексировать табличный литерал: {foo = "bar"}.foo выдаст ошибку. Лечится аналогично: ({foo = "bar}).foo.

 

Кроме индексации, скобочки нужны при вызове: вместо function() return 42 end() нужно писать (function() return 42 end)().

 

Наконец, есть ещё литералы численные: 42, например. В обычной Lua оборачивать их в скобки смысла, пожалуй, и не имеет, но с небольшим шаманством опять потребуются скобочки:

debug.setmetatable(0, {__call = function(self) print(self) end});

(42)()
--> 42

Правда, в OpenComputers отключён debug.setmetatable.

 

 

3. Функции с множественным выхлопом

В Lua функция может вернуть несколько значений:

local function test()
  return 1, 2, 3
end

print(test())
--> 1       2       3

Однако бывает, что нужно достать только одно значение, а про остальные забыть. Для этого нужно обернуть в скобки вызов функции, вот так:

print((test()))
--> 1

Скобочки возьмут только первое значение и отбросят остальные. С помощью функции select можно выбрать и другое по счёту:

local function identity(...)
  return ...
end

print((select(3, identity(10, 9, 8, 7, 6, 5, 4, 3, 2, 1))))
--> 8
  • Нравится 7
  • В шоке 1


0 комментариев


Рекомендуемые комментарии

Нет комментариев для отображения

Гость
Добавить комментарий...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...