在C#中,您可以执行以下操作:

var a = new {name = "cow", sound = "moooo", omg = "wtfbbq"};

在Python中,您可以执行以下操作

a = t(name = "cow", sound = "moooo", omg = "wtfbbq")

当然,默认情况下不是默认值,但是实现类t可以使您轻松实现。实际上,我在使用Python时确实做到了这一点,并且发现它对于小型一次性容器非常有用,在这些容器中您希望能够通过名称而不是通过索引(易于混淆)来访问组件。

除了这些细节外,它们与它们所服务的分割市场中的元组基本上相同。

特别是,我现在正在看以下C#代码:

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

相当于F#

type Route = {
    controller : string
    action : string
    id : UrlParameter }

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    { controller = "Home"; action = "Index"; id = UrlParameter.Optional } // Parameter defaults
  )

这既冗长又重复,更不用说烦人了。您可以在F#中接近这种语法吗?我现在不介意跳过一些箍(甚至是燃烧的箍!),如果这意味着它会给我一些有用的东西来干燥这样的代码。

最佳答案

我觉得更容易做

let route = routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}" // URL with parameters
    )
route.Defaults.Add("controller", "Home")
route.Defaults.Add("action", "Index")

或者
[ "controller", "Home"
  "action", "Index" ]
|> List.iter route.Defaults.Add

在F#中,我将避免调用会接受匿名类型的重载,就像避免在调用C#中接受FSharpList的F#方法一样。这些是特定于语言的功能。通常,存在与语言无关的重载/解决方法。

编辑

只是看了看文档-这是另一种方式
let inline (=>) a b = a, box b

let defaults = dict [
  "controller" => "Home"
  "action"     => "Index"
]
route.Defaults <- RouteValueDictionary(defaults)

关于c# - 在F#中命名元组/匿名类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8144184/

10-11 02:54