最近在用mysql库,在写数据库的时候,传入参数是Value枚举,然后可以将数据类型转换成value,比如可以把一个String类型转成Value,就像这样let str = “test”.to_string(); let v = str.to_value(); 那么问题来了,完看了一下这个函数签名,是这样的: impl<T: Into + Clone> ToValue for T { fn to_value(&self) -> Value { self.clone().into() } }
这里规定了泛型T的类型限定,然后我找了一下String类型的源码,并未发现String有去实现into这个函数,而且mysql是第三方库,标准库是不可能去实现这个的吧?只能是mysql的库去干了点什么,但是确实是可以let str = “test”.to_string(); let v = str.to_value();去用。 而且我看Into这个trait的签名,是继承Sized的,而String是动态size的 能我想问的是,这其中到底是怎么回事?为什么string没有实现mysql第三方库相关的trait的函数,为什么能调用呢?底层到底干了什么?在哪儿干的? 请大佬解答一下,教教其中的原理
评论区
写评论好的,谢谢,已经找到实现from特性代码,之前把关注点集中在into去了,忘记实现from,rust会自动实现into 对以下内容的回复:
因为Value实现了From特性