2013-04-07 2 views
4

В чем разница между этими myFunc?Разница между названной функцией & анонимной функцией (Lua)

код 1

function wrapper() 
    local someVariable = 0; 
    function myFunc(n) 
     if n > 0 then return myFunc(n-1) end 
    end 
    return myFunc; 
end 

код 2

function wrapper() 
    local someVariable = 0; 
    local myFunc = function(n) 
     if n > 0 then return myFunc(n-1) end 
    end 
    return myFunc; 
end 

код 3

function wrapper() 
    local someVariable = 0; 
    local myFunc; 
    myFunc = function(n) 
     if n > 0 then return myFunc(n-1) end 
    end; 
    return myFunc; 
end 

Потому что, когда я имею в виду имя функции myFunc внутри самого myFunc. Их поведение не одно и то же. (Например, повышать стоимость someVariable ... проблематична:. -S)

ответ

5

[править:. Я неправильно понял ваш код # 2]

код # 1 устанавливает глобальное значение myFunc функции. Поэтому каждый раз, когда вы вызываете wrapper, вы будете устанавливать этот глобальный в новое значение. Кроме того, любые ссылки на ваш вызов myFunc будут на этот глобальный (который может быть изменен), а не на локальный (это будет верхним значением закрытия).

Код №2 устанавливает локальную переменную myFunc. Однако, из-за правил Lua, эта локальная переменная входит только в область после инструкция, определяющая ее. Это позволяет делать такие вещи, как это:

local x = x or 5 

x в выражении предварительно объявленной локальной или глобальной. Новый x не входит в объем до тех пор, пока не будет оценено выражение x or 5.

То же самое касается определения функции. Поэтому любые ссылки на myFunc будут иметь глобальную переменную , а не локальную.

Код №3 создает локальную переменную myFunc. Затем он устанавливает в эту переменную функцию. Поскольку функция создана после, локальная переменная попадает в область видимости, ссылки на myFunc в функции будут ссылаться на локальную переменную, а не на глобальную.

Отметьте, что local function X эквивалентно local X; X = function.... Не до local X = function.... Ответ

+0

Спасибо! Итак, когда я использую 'local function myFunc()' в коде 1, все они становятся идентичными? – HKTonyLee

+0

@ HKTonyLee: Собственно, нет. Я полностью неправильно читаю ваш товар №2. Смотрите мою новую версию. –

2

Никол в основном правильно, но есть одна вещь, которую стоит отметить,:

В Code 2 MyFunc не должна быть глобальная переменная, она может быть локальной переменной в некоторой внешней области, который станет повышением для этой функции, которую вы создаете (тот же комментарий также относится к коду 1).Например, это будет печатать 100:

local function myFunc(n) return 100 end 
function wrapper() 
    local someVariable = 0; 
    local myFunc = function(n) 
     if n > 0 then return myFunc(n-1) end 
    end 
    return myFunc; 
end 
print(wrapper()(1)) 

Таким образом, чтобы подвести итог, есть четыре способа можно использовать для определения MyFunc:

  1. local myFunc; myFunc = function(n) ... return myFunc(n-1) end
  2. local function myFunc(n) ... return myFunc(n-1) end
  3. local myFunc = function(n) ... return myFunc(n-1) end
  4. myFunc = function(n) ... return myFunc(n-1) end

1 и 2 являются полными эквивалентами. 3 не будет делать то, что вы ожидаете, поскольку он будет использовать любое определение myFunc, когда будет выполнено local myFunc (что может указывать на повышение значения для MyFunc или глобальной переменной). 4 будет работать, но только потому, что он назначит вновь созданную функцию (снова) либо upvalue, либо глобальную переменную (и ссылку на то же значение в теле функции).

Смежные вопросы