2

私はこのコードを持っています

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

引数として渡された関数を呼び出すのに問題があるようです。

4

1 に答える 1

6

関数を として宣言しましたが、self:maybe()として呼び出していますopt.maybe()。として呼び出す必要がありますopt:maybe()

として宣言することは、 としてself:maybe(alt, f)宣言することと同じself.maybe(self, alt, f)です。したがって、 a で呼び出す場合は、.3 つの引数が必要です。2 を渡しているので、self最終的には"Nothing"となりalt、関数オブジェクトとして終了します。

ただし、これを as として呼び出すことは、必要な 3 つの引数を提供するものを指定opt:maybe("Nothing", f)することと同じです。opt.maybe(opt, "Nothing", f)

于 2013-02-27T09:02:09.080 に答える