【发布时间】:2012-03-21 05:30:36
【问题描述】:
在 ruby ( &:symbol ) 中是否有类似于 symbol_to_proc 的运算符,其中
#Toto
等价于
(fun x -> x.Toto)
【问题讨论】:
在 ruby ( &:symbol ) 中是否有类似于 symbol_to_proc 的运算符,其中
#Toto
等价于
(fun x -> x.Toto)
【问题讨论】:
不完全是,但你可以这样做:
let (!?) p (x:obj) =
x.GetType().GetProperty(p).GetValue(x)
let four = !?"Length" [5..8]
这使用了反射,因此它的效率不如[5..8].Length,但它可能会给你想要的表现力。
【讨论】:
namelist |> List.map length)。
kvb 的解决方案是唯一适用于一般情况的解决方案(您希望能够在运行时指定属性名称)。
但是,如果您在编译时知道属性的名称,并且还希望 要求该属性存在于任何输入中,则可以使用 F# 静态约束,如下所示:
// Define the 'toto' operator
let inline toto (a : ^a) =
(^a : (member Toto: string with get) (a))
type MyType () =
member __.Toto with get () = "Toto"
// Create an instance of MyType
let t = MyType()
printf "The song is 'Africa', by %s" (toto t)
【讨论】: