在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/