【问题标题】:Calling functions passed as arguments in Lua在 Lua 中调用作为参数传递的函数
【发布时间】:2013-02-13 00:12:57
【问题描述】:

我有这个代码

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

我似乎无法调用作为参数传递的函数。

【问题讨论】:

    标签: functional-programming lua


    【解决方案1】:

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

    【讨论】:

    • 迈克,如果您要编辑我的代码,请确保您实际上是正确的。 maybe() 的第一个参数,即self,确实得到了值"Nothing"。它没有得到nil
    • 如果您感到困惑,在 OP 的源代码中对opt.maybe() 的调用将其称为opt.maybe("Nothing", function(s)...end)
    猜你喜欢
    • 1970-01-01
    • 2012-12-16
    • 2013-10-10
    • 2013-06-03
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多