Let for-loop iterate Dict with an iterator (#3318)

This commit is contained in:
Leedehai 2024-02-02 03:52:58 -05:00 committed by GitHub
parent 42f59af812
commit c06a71f653
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 11 additions and 3 deletions

View file

@ -145,8 +145,8 @@ impl Eval for ast::ForLoop<'_> {
iter!(for pattern in array);
}
(_, Value::Dict(dict)) => {
// Iterate over pairs of dict.
iter!(for pattern in dict.pairs());
// Iterate over key-value pairs of dict.
iter!(for pattern in dict.iter());
}
(Pattern::Normal(_) | Pattern::Placeholder(_), Value::Str(str)) => {
// Iterate over graphemes of string.

View file

@ -9,7 +9,7 @@ use smallvec::SmallVec;
use unicode_math_class::MathClass;
use crate::diag::{At, SourceResult, StrResult};
use crate::foundations::{repr, NativeElement, Packed, Repr, Type, Value};
use crate::foundations::{array, repr, NativeElement, Packed, Repr, Str, Type, Value};
use crate::syntax::{Span, Spanned};
#[rustfmt::skip]
@ -182,6 +182,12 @@ impl IntoValue for Value {
}
}
impl IntoValue for (&Str, &Value) {
fn into_value(self) -> Value {
Value::Array(array![self.0.clone(), self.1.clone()])
}
}
impl<T: IntoValue + Clone> IntoValue for Cow<'_, T> {
fn into_value(self) -> Value {
self.into_owned().into_value()

View file

@ -195,6 +195,8 @@ For loops can iterate over a variety of collections:
- `{for pair in dict {..}}` \
Iterates over the key-value pairs of the [dictionary]($dictionary).
The pairs can also be destructured by using `{for (key, value) in dict {..}}`.
It is more efficient than `{for pair in dict.pairs() {..}}` because it doesn't
create a temporary array of all key-value pairs.
- `{for letter in "abc" {..}}` \
Iterates over the characters of the [string]($str). Technically, it iterates