Здравствуйте, Sinclair, Вы писали:
S>Потому, что про нелокальные функции у компилятора нет информации.
то есть вызвать нелокальные функции в обработке property.set он может, а в init блоке он их уже не видит? Или может я не понял, что имеется в виду под локальными функциями? Локальные в модуле, классе, функции?
S>Попробуйте переписать пример с использованием Optional. Станет хуже
переписал. Не вижу, что стало хуже
using System;
using System.Collections.Generic;
using Optional;
public class Node<T>
{
public required T Value { get; set; }
public Option<Node<T>> Next { get; set; }
public Option<Node<T>> Previous { get; set; }
public Node(T value)
{
Value = value;
Next = Option.None<Node<T>>();
Previous = Option.None<Node<T>>();
}
public static Option<Node<T>> Init<T>(IEnumerable<T> values)
{
using var enumerator = values.GetEnumerator();
if (!enumerator.MoveNext())
return Option.None<Node<T>>();
var head = new Node<T>(enumerator.Current);
var current = head;
while (enumerator.MoveNext())
{
var newNode = new Node<T>(enumerator.Current);
current.Next = Option.Some(newNode);
newNode.Previous = Option.Some(current);
current = newNode;
}
return Option.Some(head);
}
public static IEnumerable<T> TraverseForward<T>(Option<Node<T>> start)
{
var current = start;
while (current.Match(
some: node =>
{
yield return node.Value;
current = node.Next;
return true;
},
none: () => false
)) { }
}
}
S>Что именно непонятно или вызывает сомнения?
ну вот привёл код выше. Чем секция init будет лучше? Позволит писать компактнее — спорно. Безопаснее — да нисколько. В общем motivation должен быть в виде сравнения. Вот у меня был такой workaround, а вот так получается с init блоком. Второй вариант очевидно лучше по следующим причинам ... Сейчас лично мне совсем не очевидно.