我有这个代码
Option = { }
function Option.nothing( )
local self = { isNone = true, isSome = false }
function self:orElse( alt )
return alt
end
function self:map( f )
return Option.nothing( )
end
function self:exec( f )
end
function self:maybe( alt, f )
return alt
end
return self
end
function Option.just( val )
local self = { isNone = false, isSome = true }
local value = val
function self:orElse( alt )
return value
end
function self:map( f )
return Option.just( f(value) )
end
function self:exec( f )
f( value )
end
function self:maybe( alt, f )
return f(value)
end
return self
end
function printOpt( opt )
local str = opt.maybe( "Nothing", function(s) return "Just " .. s end )
print( str )
end
x = Option.nothing( )
y = Option.just( 4 )
printOpt(x)
printOpt(y)
但是我一直在这里“尝试调用本地'f'(一个nil值)”:
function self:maybe( alt, f )
return f(value)
end
似乎我在调用作为参数传递的函数时遇到麻烦。
最佳答案
您将该函数声明为self:maybe()
,但您将其称为opt.maybe()
。您应该将其称为opt:maybe()
。
将其声明为self:maybe(alt, f)
等效于将其声明为self.maybe(self, alt, f)
。因此,如果您使用.
调用它,则需要3个参数。您要传递2,所以self
最终以"Nothing"
结束,而alt
最终以函数对象的形式出现。
但是,将其称为opt:maybe("Nothing", f)
相当于说出opt.maybe(opt, "Nothing", f)
,它提供了所需的3个args。
关于functional-programming - 在Lua中作为参数传递的调用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15107837/