固定长度的本机类型数组(或实现Copy特征的类型)可以在Rust中克隆到32的长度.也就是说,这会编译:
fn main() {
let source: [i32; 32] = [0; 32]; // length 32
let _cloned = source.clone();
}
Run Code Online (Sandbox Code Playgroud)
但这不是:
fn main() {
let source: [i32; 33] = [0; 33]; // length 33
let _cloned = source.clone(); // <-- compile error
}
Run Code Online (Sandbox Code Playgroud)
实际上,traitClone只为每个通用数组长度声明一个方法,从0到32.
什么是克隆长度的通用数组的有效和惯用的方法,比如33?
在编译时,如何在scala 2.11中检索当前源文件的名称(代码编写的位置)?
我想要实现的是一种方法:
理想情况下,我想在IDE中键入以下表达式:
val record = types.addValue("test").addValue(123).addValue(new java.util.Date())
Run Code Online (Sandbox Code Playgroud)
具有addValue()由IDE类型推理引擎约束的参数类型.
以下是第1点的工作实现:记录字段类型的规范:
case class FieldType[V, T <: FieldType[_, _]](clazz: Class[V], tail: T) {
def addValue(value: V) = FieldValue(value, tail)
}
case class FieldValue[V, T <: FieldType[_, _]](value: V, tail: T)
object emptyFieldType extends FieldType(classOf[Null], null)
Run Code Online (Sandbox Code Playgroud)
这是一个由以下内容组成的记录的示例规范String, Int, Date:
val types = FieldType(
classOf[String], FieldType(
classOf[Int], FieldType(
classOf[java.util.Date], emptyFieldType
)
)
)
Run Code Online (Sandbox Code Playgroud)
通过使用类型中的addValue方法FieldType,编译器可以识别任何深度的参数类型:
val a = types.addValue("") // here only …Run Code Online (Sandbox Code Playgroud)