【发布时间】:2015-05-22 19:13:02
【问题描述】:
我最初的问题是将不同类型的元组转换为字符串。在 Python 中,这将类似于:
>> a = ( 1.3, 1, 'c' )
>> b = map( lambda x: str(x), a )
['1.3', '1', 'c']
>> " ".join(b)
'1.3 1 c"
然而,Rust 不支持元组上的映射——只支持类向量结构。显然,这是由于能够将不同的类型打包到一个元组中,并且没有函数重载。此外,我找不到在运行时获取元组长度的方法。所以,我想,需要一个宏来进行转换。
首先,我尝试匹配元组的头部,例如:
// doesn't work
match some_tuple {
(a, ..) => println!("{}", a),
_ => ()
}
所以,我的问题:
- 是否可以使用库函数将元组转换为字符串,指定任意分隔符?
- 如何编写宏以将函数映射到任意大小的元组?
【问题讨论】:
-
请注意,在 Rust 中,元组的数量在编译时是已知的(与 Python 不同),并且没有 Rust 没有 可变参数;元组是编译器的特殊情况,并且特征是“手动”为许多 arities 实现的。
-
Python 倾向于将类型聚集在一起,而 Rust 则相反;在 Python 中,所有元组都是一种类型,所有函数都是一种类型;在 Rust 中,元组中的每个字段类型组合都是不同的类型,每个函数都是自己唯一的类型。这是方法上的不同:在 Python 中,一切都在运行时解决;在 Rust 中,在编译时。元组在 Rust 中只是未命名的元组结构,彼此没有关系。
-
@MatthieuM.: 是否有可能将元组的 arity 设为常量?
-
@ChrisMorgan:不过,如果元组中有不同的类型,如果所有类型都实现该特征,则应该可以调用某个特征的某个函数,例如“.to_string()”。我意识到,调用任意函数是不可能的,因为 atm 没有实现重载。
-
@oleid: 不一定,只有当它被明确实现时。毕竟,你对人性化的
fmt::Display有什么期望(.to_string()使用的是什么)?a b c,a, b, c,(a, b, c)?没有一个是“正确的”,没有一个是“正确的”。