Primitive Type tuple

1.0.0 ·
Expand description

一个有限异构序列,(T, U, ..)

让我们依次介绍其中的每一个:

元组是有限的。换句话说,元组具有长度。这是长度为 3 的元组:

("hello", 5, 'c');
Run

‘Length’ 有时也称为 ‘arity’; 每个不同长度的元组都是不同的,不同的类型。

元组是异构的。这意味着元组的每个元素可以具有不同的类型。 在上面的元组中,其类型为:

(&'static str, i32, char)
Run

元组是一个序列。这意味着可以按位置访问它们; 这称为元组索引,它看起来像这样:

let tuple = ("hello", 5, 'c');

assert_eq!(tuple.0, "hello");
assert_eq!(tuple.1, 5);
assert_eq!(tuple.2, 'c');
Run

元组的顺序性质适用于各种 traits 的实现。 例如,在 PartialOrdOrd 中,元素按顺序进行比较,直到找到第一个不相等的集合。

有关元组的更多信息,请参见 这本书

trait 实现

在本文档中,简写 (T₁, T₂,…, Tₙ) 用于表示不同长度的元组。 当使用它时,在 T 上表达的任何 trait bound 都独立地应用于元组的每个元素。 请注意,这是一种方便的符号,以避免重复文档,不是有效的 Rust 语法。

由于 Rust 的类型系统的临时限制,以下 traits 仅在 arity 12 或更少的元组上实现。 在未来,这可能会改变:

以下 traits 用于任意长度的元组。 这些 traits 具有由编译器自动生成的实现,因此不受缺少语言特性的限制。

Examples

基本用法:

let tuple = ("hello", 5, 'c');

assert_eq!(tuple.0, "hello");
Run

当您要返回多个值时,通常将元组用作返回类型:

fn calculate_point() -> (i32, i32) {
    // 不要进行计算,这不是示例的重点
    (4, 5)
}

let point = calculate_point();

assert_eq!(point.0, 4);
assert_eq!(point.1, 5);

// 将此与模式结合起来会更好。

let (x, y) = calculate_point();

assert_eq!(x, 4);
assert_eq!(y, 5);
Run

可以从适当长度的数组创建同构元组:

let array: [u32; 3] = [1, 2, 3];
let tuple: (u32, u32, u32) = array.into();
Run

Trait Implementations§

source§

impl<T: Clone> Clone for (T₁, T₂, …, Tₙ)

这个 trait 在任意长度的元组上实现。

source§

fn clone(&self) -> Self

返回值的副本。 Read more
source§

fn clone_from(&mut self, source: &Self)

source 执行复制分配。 Read more
source§

impl<T> Debug for (T₁, T₂, …, Tₙ)where T: Debug + ?Sized,

This trait is implemented for tuples up to twelve items long.

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

使用给定的格式化程序格式化该值。 Read more
source§

impl<T> Default for (T₁, T₂, …, Tₙ)where T: Default,

This trait is implemented for tuples up to twelve items long.

source§

fn default() -> (T,)

返回类型的 “默认值”。 Read more
1.2.0 · source§

impl<'a, K, V, A> Extend<(&'a K, &'a V)> for BTreeMap<K, V, A>where K: Ord + Copy, V: Copy, A: Allocator + Clone,

source§

fn extend<I>(&mut self, iter: I)where I: IntoIterator<Item = (&'a K, &'a V)>,

使用迭代器的内容扩展集合。 Read more
source§

fn extend_one(&mut self, _: (&'a K, &'a V))

🔬This is a nightly-only experimental API. (extend_one #72631)
用一个元素扩展一个集合。
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
在集合中为给定数量的附加元素保留容量。 Read more
1.4.0 · source§

impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap<K, V, S>where K: Eq + Hash + Copy, V: Copy, S: BuildHasher,

source§

fn extend<T: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: T)

使用迭代器的内容扩展集合。 Read more
source§

fn extend_one(&mut self, (k, v): (&'a K, &'a V))

🔬This is a nightly-only experimental API. (extend_one #72631)
用一个元素扩展一个集合。
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
在集合中为给定数量的附加元素保留容量。 Read more
1.56.0 · source§

impl<A, B, ExtendA, ExtendB> Extend<(A, B)> for (ExtendA, ExtendB)where ExtendA: Extend<A>, ExtendB: Extend<B>,

source§

fn extend<T>(&mut self, into_iter: T)where T: IntoIterator<Item = (A, B)>,

允许 extend 一个集合的元组也实现 Extend

另请参见:Iterator::unzip

Examples
let mut tuple = (vec![0], vec![1]);
tuple.extend([(2, 3), (4, 5), (6, 7)]);
assert_eq!(tuple.0, [0, 2, 4, 6]);
assert_eq!(tuple.1, [1, 3, 5, 7]);

// 还允许任意嵌套的元组作为元素
let mut nested_tuple = (vec![1], (vec![2], vec![3]));
nested_tuple.extend([(4, (5, 6)), (7, (8, 9))]);

let (a, (b, c)) = nested_tuple;
assert_eq!(a, [1, 4, 7]);
assert_eq!(b, [2, 5, 8]);
assert_eq!(c, [3, 6, 9]);
Run
source§

fn extend_one(&mut self, item: (A, B))

🔬This is a nightly-only experimental API. (extend_one #72631)
用一个元素扩展一个集合。
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
在集合中为给定数量的附加元素保留容量。 Read more
source§

impl<K, V, A> Extend<(K, V)> for BTreeMap<K, V, A>where K: Ord, A: Allocator + Clone,

source§

fn extend<T>(&mut self, iter: T)where T: IntoIterator<Item = (K, V)>,

使用迭代器的内容扩展集合。 Read more
source§

fn extend_one(&mut self, _: (K, V))

🔬This is a nightly-only experimental API. (extend_one #72631)
用一个元素扩展一个集合。
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
在集合中为给定数量的附加元素保留容量。 Read more
source§

impl<K, V, S> Extend<(K, V)> for HashMap<K, V, S>where K: Eq + Hash, S: BuildHasher,

插入迭代器中的所有新键值,并用迭代器返回的新值替换现有键中的值。

source§

fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T)

使用迭代器的内容扩展集合。 Read more
source§

fn extend_one(&mut self, (k, v): (K, V))

🔬This is a nightly-only experimental API. (extend_one #72631)
用一个元素扩展一个集合。
source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one #72631)
在集合中为给定数量的附加元素保留容量。 Read more
1.71.0 · source§

impl<T> From<[T; 1]> for (T,)

source§

fn from(array: [T; 1]) -> (T,)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 10]> for (T, T, T, T, T, T, T, T, T, T)

source§

fn from(array: [T; 10]) -> (T, T, T, T, T, T, T, T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 11]> for (T, T, T, T, T, T, T, T, T, T, T)

source§

fn from(array: [T; 11]) -> (T, T, T, T, T, T, T, T, T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 12]> for (T, T, T, T, T, T, T, T, T, T, T, T)

source§

fn from(array: [T; 12]) -> (T, T, T, T, T, T, T, T, T, T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 2]> for (T, T)

source§

fn from(array: [T; 2]) -> (T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 3]> for (T, T, T)

source§

fn from(array: [T; 3]) -> (T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 4]> for (T, T, T, T)

source§

fn from(array: [T; 4]) -> (T, T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 5]> for (T, T, T, T, T)

source§

fn from(array: [T; 5]) -> (T, T, T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 6]> for (T, T, T, T, T, T)

source§

fn from(array: [T; 6]) -> (T, T, T, T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 7]> for (T, T, T, T, T, T, T)

source§

fn from(array: [T; 7]) -> (T, T, T, T, T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 8]> for (T, T, T, T, T, T, T, T)

source§

fn from(array: [T; 8]) -> (T, T, T, T, T, T, T, T)

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<[T; 9]> for (T, T, T, T, T, T, T, T, T)

source§

fn from(array: [T; 9]) -> (T, T, T, T, T, T, T, T, T)

从输入类型转换为此类型。
1.17.0 · source§

impl<I> From<(I, u16)> for SocketAddrwhere I: Into<IpAddr>,

source§

fn from(pieces: (I, u16)) -> SocketAddr

将元组结构体 (Into <IpAddr>,u16) 转换为 SocketAddr

此转换为 IpAddr::V4 创建 SocketAddr::V4,并为 IpAddr::V6 创建 SocketAddr::V6

u16 被视为新创建的 SocketAddr 的端口。

1.71.0 · source§

impl<T> From<(T,)> for [T; 1]

source§

fn from(tuple: (T,)) -> [T; 1]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T)> for [T; 2]

source§

fn from(tuple: (T, T)) -> [T; 2]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T)> for [T; 3]

source§

fn from(tuple: (T, T, T)) -> [T; 3]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T)> for [T; 4]

source§

fn from(tuple: (T, T, T, T)) -> [T; 4]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T, T)> for [T; 5]

source§

fn from(tuple: (T, T, T, T, T)) -> [T; 5]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T, T, T)> for [T; 6]

source§

fn from(tuple: (T, T, T, T, T, T)) -> [T; 6]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T, T, T, T)> for [T; 7]

source§

fn from(tuple: (T, T, T, T, T, T, T)) -> [T; 7]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T, T, T, T, T)> for [T; 8]

source§

fn from(tuple: (T, T, T, T, T, T, T, T)) -> [T; 8]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T, T, T, T, T, T)> for [T; 9]

source§

fn from(tuple: (T, T, T, T, T, T, T, T, T)) -> [T; 9]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T, T, T, T, T, T, T)> for [T; 10]

source§

fn from(tuple: (T, T, T, T, T, T, T, T, T, T)) -> [T; 10]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T, T, T, T, T, T, T, T)> for [T; 11]

source§

fn from(tuple: (T, T, T, T, T, T, T, T, T, T, T)) -> [T; 11]

从输入类型转换为此类型。
1.71.0 · source§

impl<T> From<(T, T, T, T, T, T, T, T, T, T, T, T)> for [T; 12]

source§

fn from(tuple: (T, T, T, T, T, T, T, T, T, T, T, T)) -> [T; 12]

从输入类型转换为此类型。
source§

impl<K, V> FromIterator<(K, V)> for BTreeMap<K, V, Global>where K: Ord,

source§

fn from_iter<T>(iter: T) -> BTreeMap<K, V, Global>where T: IntoIterator<Item = (K, V)>,

从迭代器创建一个值。 Read more
source§

impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>where K: Eq + Hash, S: BuildHasher + Default,

source§

fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> HashMap<K, V, S>

从迭代器创建一个值。 Read more
source§

impl<T> Hash for (T₁, T₂, …, Tₙ)where T: Hash + ?Sized,

This trait is implemented for tuples up to twelve items long.

source§

fn hash<S>(&self, state: &mut S)where S: Hasher,

将该值输入给定的 HasherRead more
source§

impl<T> Ord for (T₁, T₂, …, Tₙ)where T: Ord + ?Sized,

This trait is implemented for tuples up to twelve items long.

source§

fn cmp(&self, other: &(T,)) -> Ordering

此方法返回 selfother 之间的 OrderingRead more
source§

impl<T> PartialEq<(T,)> for (T₁, T₂, …, Tₙ)where T: PartialEq<T> + ?Sized,

This trait is implemented for tuples up to twelve items long.

source§

fn eq(&self, other: &(T,)) -> bool

此方法测试 selfother 值是否相等,并由 == 使用。
source§

fn ne(&self, other: &(T,)) -> bool

此方法测试 !=。 默认实现几乎总是足够的,并且不应在没有充分理由的情况下被覆盖。
source§

impl<T> PartialOrd<(T,)> for (T₁, T₂, …, Tₙ)where T: PartialOrd<T> + ?Sized,

This trait is implemented for tuples up to twelve items long.

source§

fn partial_cmp(&self, other: &(T,)) -> Option<Ordering>

如果存在,则此方法返回 selfother 值之间的顺序。 Read more
source§

fn lt(&self, other: &(T,)) -> bool

此方法测试的内容少于 (对于 selfother),并且由 < 操作员使用。 Read more
source§

fn le(&self, other: &(T,)) -> bool

此方法测试小于或等于 (对于 selfother),并且由 <= 运算符使用。 Read more
source§

fn ge(&self, other: &(T,)) -> bool

此方法测试是否大于或等于 (对于 selfother),并且由 >= 运算符使用。 Read more
source§

fn gt(&self, other: &(T,)) -> bool

此方法测试大于 (对于 selfother),并且由 > 操作员使用。 Read more
1.28.0 · source§

impl<'a, T> RangeBounds<T> for (Bound<&'a T>, Bound<&'a T>)where T: 'a + ?Sized,

source§

fn start_bound(&self) -> Bound<&T>

开始索引绑定。 Read more
source§

fn end_bound(&self) -> Bound<&T>

结束索引绑定。 Read more
1.35.0 · source§

fn contains<U>(&self, item: &U) -> boolwhere T: PartialOrd<U>, U: PartialOrd<T> + ?Sized,

如果范围中包含 item,则返回 trueRead more
1.28.0 · source§

impl<T> RangeBounds<T> for (Bound<T>, Bound<T>)

source§

fn start_bound(&self) -> Bound<&T>

开始索引绑定。 Read more
source§

fn end_bound(&self) -> Bound<&T>

结束索引绑定。 Read more
1.35.0 · source§

fn contains<U>(&self, item: &U) -> boolwhere T: PartialOrd<U>, U: PartialOrd<T> + ?Sized,

如果范围中包含 item,则返回 trueRead more
1.53.0 · source§

impl<T> SliceIndex<[T]> for (Bound<usize>, Bound<usize>)

§

type Output = [T]

方法返回的输出类型。
source§

fn get( self, slice: &[T] ) -> Option<&<(Bound<usize>, Bound<usize>) as SliceIndex<[T]>>::Output>

🔬This is a nightly-only experimental API. (slice_index_methods)
如果在边界内,则返回此位置输出的共享引用。
source§

fn get_mut( self, slice: &mut [T] ) -> Option<&mut <(Bound<usize>, Bound<usize>) as SliceIndex<[T]>>::Output>

🔬This is a nightly-only experimental API. (slice_index_methods)
如果在边界内,则对此位置的输出返回一个可变引用。
source§

unsafe fn get_unchecked( self, slice: *const [T] ) -> *const <(Bound<usize>, Bound<usize>) as SliceIndex<[T]>>::Output

🔬This is a nightly-only experimental API. (slice_index_methods)
返回此位置输出的共享引用,而不执行任何边界检查。 即使未使用所得的引用,使用越界索引或悬垂的 slice 指针调用此方法也是 [undefined 行为]
source§

unsafe fn get_unchecked_mut( self, slice: *mut [T] ) -> *mut <(Bound<usize>, Bound<usize>) as SliceIndex<[T]>>::Output

🔬This is a nightly-only experimental API. (slice_index_methods)
返回此位置输出的变量引用,而不执行任何边界检查。 即使未使用所得的引用,使用越界索引或悬垂的 slice 指针调用此方法也是 [undefined 行为]
source§

fn index( self, slice: &[T] ) -> &<(Bound<usize>, Bound<usize>) as SliceIndex<[T]>>::Output

🔬This is a nightly-only experimental API. (slice_index_methods)
返回此位置输出的共享引用,如果越界则会触发 panic。
source§

fn index_mut( self, slice: &mut [T] ) -> &mut <(Bound<usize>, Bound<usize>) as SliceIndex<[T]>>::Output

🔬This is a nightly-only experimental API. (slice_index_methods)
返回此位置输出的变量引用,如果越界则会触发 panic。
source§

impl ToSocketAddrs for (&str, u16)

§

type Iter = IntoIter<SocketAddr, Global>

在此类型可能对应的套接字地址上返回的迭代器。
source§

fn to_socket_addrs(&self) -> Result<IntoIter<SocketAddr>>

将此对象转换为已解析的 SocketAddr 的迭代器。 Read more
source§

impl ToSocketAddrs for (IpAddr, u16)

§

type Iter = IntoIter<SocketAddr>

在此类型可能对应的套接字地址上返回的迭代器。
source§

fn to_socket_addrs(&self) -> Result<IntoIter<SocketAddr>>

将此对象转换为已解析的 SocketAddr 的迭代器。 Read more
source§

impl ToSocketAddrs for (Ipv4Addr, u16)

§

type Iter = IntoIter<SocketAddr>

在此类型可能对应的套接字地址上返回的迭代器。
source§

fn to_socket_addrs(&self) -> Result<IntoIter<SocketAddr>>

将此对象转换为已解析的 SocketAddr 的迭代器。 Read more
source§

impl ToSocketAddrs for (Ipv6Addr, u16)

§

type Iter = IntoIter<SocketAddr>

在此类型可能对应的套接字地址上返回的迭代器。
source§

fn to_socket_addrs(&self) -> Result<IntoIter<SocketAddr>>

将此对象转换为已解析的 SocketAddr 的迭代器。 Read more
1.46.0 · source§

impl ToSocketAddrs for (String, u16)

§

type Iter = IntoIter<SocketAddr, Global>

在此类型可能对应的套接字地址上返回的迭代器。
source§

fn to_socket_addrs(&self) -> Result<IntoIter<SocketAddr>>

将此对象转换为已解析的 SocketAddr 的迭代器。 Read more
source§

impl<T: Copy> Copy for (T₁, T₂, …, Tₙ)

这个 trait 在任意长度的元组上实现。

source§

impl<T> Eq for (T₁, T₂, …, Tₙ)where T: Eq + ?Sized,

This trait is implemented for tuples up to twelve items long.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

获取 selfTypeIdRead more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

从拥有的值中一成不变地借用。 Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

从拥有的值中借用。 Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

返回未更改的参数。

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

调用 U::from(self)

也就是说,这种转换是 From<T> for U 实现选择执行的任何操作。

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

获得所有权后的结果类型。
source§

fn to_owned(&self) -> T

从借用的数据创建拥有的数据,通常是通过克隆。 Read more
source§

fn clone_into(&self, target: &mut T)

使用借来的数据来替换拥有的数据,通常是通过克隆。 Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

发生转换错误时返回的类型。
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

执行转换。
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

发生转换错误时返回的类型。
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

执行转换。