24

I would like to know if it is possible to get the type (int32 / float64 / string) from a value in Nim at runtime?

I thought this would be possible with the "typeinfo" library but I can't figure it out!

EDIT: Got an answer and made this real quick:

import typetraits

type
    MyObject = object
        a, b: int
        s: string

let obj = MyObject(a: 3, b: 4, s: "abc")

proc dump_var[T: object](x: T) =
    echo x.type.name, " ("
    for n, v in fieldPairs(x):
        echo("    ", n, ": ", v.type.name, " = ", v)
    echo ")"

dump_var obj

Output:

MyObject (
    a: int = 3
    b: int = 4
    s: string = abc
)
4

2 回答 2

25

Close, it's in the typetraits module:

import typetraits

var x = 12
echo x.type.name
于 2015-02-05T20:09:26.183 回答
2

You can use stringify operator $, which has a overloaded signature of

proc `$`(t: typedesc): string {...}

For example,

doAssert $(42.typeof) == "int"

Note that nim manual encourages using typeof(x) instead of type(x),

typeof(x) can for historical reasons also be written as type(x) but type(x) is discouraged.

于 2021-05-19T09:18:48.317 回答