Функция Lua должна быть назначена переменной

Недавно я пытался изучить lua, и сегодня я наткнулся на то, чего не понял с функциями, приведенный ниже код не работал.

    function iter()
  local i=0
  return function() print(i); i=i+1; end
end

iter()
iter()

Мне пришлось назначить переменную моей функции iter (), а затем вызвать переменную, прежде чем она запустится:

    function iter()
  local i=0
  return function() print(i); i=i+1; end
end

it=iter()
it()
it()

кто-нибудь может прояснить, почему это так?

Добро пожаловать в SO! Ваш код действительно работал (также, на будущее, пожалуйста, не забывайте всегда уточнять, что означает «не работает»). Он просто возвращает функцию, которая выполняет приращение. Вам может быть полезно взглянуть на lua.org/pil/6.1.html

Ash 29.05.2018 21:24

о, спасибо, я посмотрю на это. также это мой первый раз здесь, поэтому в следующий раз я постараюсь быть более конкретным :)

Mick Breiting 29.05.2018 21:27
Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
1
2
90
1

Ответы 1

Прежде всего, функции - это просто значения. Ваша внешняя функция назначена переменной iter. Эта функция возвращает анонимную функцию. («Анонимный» просто означает, что вы не дали функции имя перед ее возвратом.)

Во-вторых, список аргументов в круглых скобках - это, по сути, оператор, вызывающий функцию (если только он не указан в объявлении функции). Когда вы используете этот оператор, функция запускается, и выражение дает возвращаемое значение.

В операторе iter() вы вызываете функцию и игнорируете ее возвращаемое значение, поэтому вы никогда не увидите, как выполняется внутренняя функция.

В операторе it = iter() вы получаете именованную функцию с именем it. Каждый раз, когда вы его вызываете, он увеличивает переменную i изнутри вызова iter, который ее создал.

В качестве примечания можно сказать, что iter()() немедленно вызывает возвращаемую функцию. На самом деле это не будет полезно в вашем случае, потому что каждый вызов iter возвращает новое закрытие с i, начиная с нуля.

большое спасибо! ответил на мой вопрос, и я узнал больше о функциях :)

Mick Breiting 31.05.2018 16:34

Другие вопросы по теме