在Lua中调用作为参数传递的函数。

我有以下代码

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

似乎我在调用作为参数传递的函数时遇到了麻烦。

点赞
用户582
用户582

您将该函数声明为 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 个参数。

2013-02-27 09:02:09