C# 事件处理程序分配(在 CocosSharp 中),转换为 F#
C# event handler assignment (in CocosSharp), translation to F#
我正在尝试将此 C# 代码翻译成 F#,因为我正在学习 CocosSharp (http://developer.xamarin.com/guides/cross-platform/game_development/cocossharp/first_game/part3/)。
我在正确定义 HandleTouchesMoved 或将其分配给 touchListener 或两者都存在错误。
C#代码:
touchListener = new CCEventListenerTouchAllAtOnce ();
touchListener.OnTouchesMoved = HandleTouchesMoved;
AddEventListener (touchListener, this);
然后是 HandleTouchesMoved:
void HandleTouchesMoved (System.Collections.Generic.List touches, CCEvent touchEvent)
{
//...
}
我的错误 F# 代码(只是 GameScene class 中的相关部分):
type GameScene (mainWindow: CCWindow) as x =
inherit CCScene (mainWindow)
let touchListener = new CCEventListenerTouchAllAtOnce ()
do
// THIS IS WHERE THE PROBLEM HAPPEN
touchListener.OnTouchesMoved <- x.HandleTouchesMoved
x.AddEventListener (touchListener, x)
member x.HandleTouchesMoved (touches: Collections.Generic.List<CCTouch>, touchEvent: CCEvent) =
()
对 OnTouchesMoved 的分配显然是错误的 - 它无法编译:
"this function takes too many arguments, or is used in a context where a function is not expected"。
可能是我缺少的作业的基本问题。请问我做错了什么?
据我所知,OnTouchesMoved
是 Action<_, _>
类型的可变 属性。通常,F# 函数与 Action
等 .NET 委托不同。现在,在某些上下文中,F# 允许您在需要委托的地方编写函数,但并非总是如此 - 所以我认为在这种情况下您需要更加明确。
我认为(未经测试)以下应该有效
touchListener.OnTouchesMoved <- Action<_,_>(fun t te ->
x.HandleTouchesMoved(t, te))
x.AddEventListener(touchListener, x)
您也可以将 HandleTouchesMoved
定义为局部函数(而不是方法)并编写如下内容:
let handleTouchesMoved (touches:ResizeArray<CCTouch>, touchEvent: CCEvent) =
()
touchListener.OnTouchesMoved <- Action<_,_>(handleTouchesMoved)
x.AddEventListener(touchListener, x)
ResizeArray
名称是 .NET 通用可变列表类型的 F# 别名。
我正在尝试将此 C# 代码翻译成 F#,因为我正在学习 CocosSharp (http://developer.xamarin.com/guides/cross-platform/game_development/cocossharp/first_game/part3/)。 我在正确定义 HandleTouchesMoved 或将其分配给 touchListener 或两者都存在错误。
C#代码:
touchListener = new CCEventListenerTouchAllAtOnce ();
touchListener.OnTouchesMoved = HandleTouchesMoved;
AddEventListener (touchListener, this);
然后是 HandleTouchesMoved:
void HandleTouchesMoved (System.Collections.Generic.List touches, CCEvent touchEvent)
{
//...
}
我的错误 F# 代码(只是 GameScene class 中的相关部分):
type GameScene (mainWindow: CCWindow) as x =
inherit CCScene (mainWindow)
let touchListener = new CCEventListenerTouchAllAtOnce ()
do
// THIS IS WHERE THE PROBLEM HAPPEN
touchListener.OnTouchesMoved <- x.HandleTouchesMoved
x.AddEventListener (touchListener, x)
member x.HandleTouchesMoved (touches: Collections.Generic.List<CCTouch>, touchEvent: CCEvent) =
()
对 OnTouchesMoved 的分配显然是错误的 - 它无法编译: "this function takes too many arguments, or is used in a context where a function is not expected"。 可能是我缺少的作业的基本问题。请问我做错了什么?
据我所知,OnTouchesMoved
是 Action<_, _>
类型的可变 属性。通常,F# 函数与 Action
等 .NET 委托不同。现在,在某些上下文中,F# 允许您在需要委托的地方编写函数,但并非总是如此 - 所以我认为在这种情况下您需要更加明确。
我认为(未经测试)以下应该有效
touchListener.OnTouchesMoved <- Action<_,_>(fun t te ->
x.HandleTouchesMoved(t, te))
x.AddEventListener(touchListener, x)
您也可以将 HandleTouchesMoved
定义为局部函数(而不是方法)并编写如下内容:
let handleTouchesMoved (touches:ResizeArray<CCTouch>, touchEvent: CCEvent) =
()
touchListener.OnTouchesMoved <- Action<_,_>(handleTouchesMoved)
x.AddEventListener(touchListener, x)
ResizeArray
名称是 .NET 通用可变列表类型的 F# 别名。