在 F# 交互中,我如何查看此会话中定义的变量/函数列表?类似于 Python 中的函数
whos()
或 R 中的 ls()
?谢谢。whos()
或 R 中的 ls()
?谢谢。GetExecutingAssembly
(在FSI本身中)获取该程序集,然后浏览类型以查找所有适当的属性。open System.Reflection
open System.Collections.Generic
let getVariables() =
let types = Assembly.GetExecutingAssembly().GetTypes()
[ for t in types |> Seq.sortBy (fun t -> t.Name) do
if t.Name.StartsWith("FSI_") then
let flags = BindingFlags.Static ||| BindingFlags.NonPublic |||
BindingFlags.Public
for m in t.GetProperties(flags) do
yield m.Name, lazy m.GetValue(null, [||]) ] |> dict
> let test1 = "Hello world";;
val test1 : string = "Hello world"
> let test2 = 42;;
val test2 : int = 42
> let vars = getVariables();;
val vars : System.Collections.Generic.IDictionary<string,Lazy<obj>>
> vars.["test1"].Value;;
val it : obj = "Hello world"
> vars.["test2"].Value;;
val it : obj = 42
Value 属性。另请注意,您得到的是对象 - 因为F#类型系统无法知道类型 - 您必须动态使用它。您可以通过迭代vars 来获取所有名称...
it
在变量中:Microsoft.FSharp.Collections.FSharpList
1[System.Reflection.PropertyInfo] it`,这是什么以及如何过滤掉它?谢谢。 - user 9081m.Name , (fun () -> m.GetValue(null, [||]))
而不是m.Name, lazy m.GetValue(null, [||])
。你可以将vars.["test1"].Value
替换为vars.["test1"]()
并获得对可变对象的支持,因为每次都会评估函数。 - Steve Channell