Забыл вставить () в имя функции, но вместо того, чтобы выдать ошибку, он дал мне новое значение. Любое объяснение? - PullRequest
1 голос
/ 03 августа 2020
function Closures()
   local b = 0
   return function() 
      b = b + 1 
      return b 
   end 
end 

bruh = Closures 
print(bruh())

У функции, которую я показал, есть проблема: переменная bruh присваивается Closures (я забыл поставить () с именем переменной). Вместо того, чтобы выдать ошибку , он дал мне другой результат.

function: 0056b7f0

Если я добавлю () к имени переменной ( Closures), я бы получил желаемый результат

1

Насколько я знаю, Closures не имя функции, а переменная это назначено функции. Зачем нам нужен (), чтобы return работало? Любое объяснение? И я действительно не могу получить функцию «кодовая вещь», ничего не вернув (она ничего не покажет, если я попытаюсь напечатать функцию, которая ничего не вернула).

EDIT : Я только что понял что если я сделаю

print(Closures())--This and 
print(Closures)

, я получу какой-то странный «код» функции:

function: 0077fa8

function 0048bc30

PS: Эта синтаксическая ошибка возникла случайно вместе с вопросом.

1 Ответ

3 голосов
/ 03 августа 2020

Функции - это значения

Для объяснения я воспользуюсь более простым примером:

Допустим, у нас есть функция func вроде этой:

local func = function() return "REEEEE" end

Мы можно назначить эту функцию новой переменной, например,

local func2 = func

Теперь func2 будет ссылкой на ту же функцию, что и func, поэтому мы можем вызвать func2(), и он вернет "REEEEE" .

Когда вы вызываете print(Closures), вы не выполняете Closures, вы просто передаете саму функцию print, поэтому он вызывает tostring функции и записывает результат в stdout.

Когда вы назначаете Closures bruh, это означает, что btuh теперь содержит ту же функцию, что и Closures, и его вызов вернет внутреннюю функцию. Но попробуйте следующее:

bruh = Closures 
print(bruh()())

Это должно напечатать 1, потому что вызов bruh возвращает функцию, а вызов, который затем возвращает число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...