Crystal语言中如何获取任意对象的类型?
Crystal 中对应 JavaScript
typeof() 的类型查询方式 Crystal 里根据查询类型的时机不同,有两种对应实现,注意不要混淆用法:
- 编译期查询编译器推断的静态类型:直接用内置关键字
typeof,和JS里的typeof()用法接近,不需要引入任何依赖,直接传入变量或表达式即可返回结果,这个结果是编译阶段就确定的,不会随程序运行时的逻辑变化。 - 运行期查询对象实际所属类型:调用对象实例的
class方法,这个是运行时动态计算的结果,在存在类型联合、继承关系的场景下,可以拿到对象当下的真实类型。
针对你贴的路由代码:
get "/" do object = {hello: "hello", world: "world"} object.to_json puts typeof(object) end
这里的object是固定结构的命名元组,编译期就能确定类型,所以puts typeof(object)最终会打印NamedTuple(hello: String, world: String),这个场景下用object.class做运行时查询也会得到一样的结果。
注意区分两个用法的核心差异:如果变量可能是多种类型(即联合类型),
typeof会返回所有可能类型的联合结果,不会因为运行时的条件判断收窄,比如:var = rand > 0.5 ? 123 : "test" puts typeof(var) # 固定输出 (Int32 | String),编译期就确定 puts var.class # 运行时随机返回 Int32 或 String,和实际值对应
内容的提问来源于stack exchange,提问作者learncodes123
相关产品推荐
相关产品推荐

