Здравствуйте, vdimas, Вы писали:
VD>>https://github.com/rsdn/nemerle/blob/master/lib/option.n#L217
V>V> public Value : T
V> {
V> get
V> {
V> if (HasValue) _value
V> else assert(false, "try use Value when it not set");
V> }
V> }
V>
V>Кошмар.
Пипец ты упертый. Вот такой же код из исходного опшона:
https://github.com/rsdn/nemerle/blob/master/lib/option.n#L106
public Value : T
{
get {
match (this) {
| Some (x) => x
| None =>
throw System.ArgumentException ("option.Value")
}
}
}
Как говорится, найдите 10 отличий.
V>В том-то и беда для ООП-языков, что тип вариант нормально не выразить
Очередной раз несешь околесицу. С точки зрения использования разницы нет.
V>потому что единственная возможность, когда в ООП можно одновременно разветвиться и изъять "откуда-то" значение, это вот такая конструкция:
V>V>MyType extractedValue;
V>Optional<MyType> optional = getValueFromSomewhere();
V>if(optional.tryExtract(extractedValue)) {
V> // blah-blah-blah
V>}
V>
Столько слов не по делу. Сказал бы, что хочешь паттер-матчинг, так я тебе бы сразу ответил бы, что это не проблема. Во-первых в Немерле можно делать МП и не по объектам, а во вторых в Немерле есть возможность расширения МП. В частности вот эти вот строки:
https://github.com/rsdn/nemerle/blob/master/lib/option.n#L215
[ExtensionPattern(VSome(value) = ValueOption where(HasValue=true, Value=value))]
[ExtensionPattern(VNone() = ValueOption where(HasValue=false))]
public struct ValueOption[T]
{
Позволяют использовать VSome(value) и VNone() для матчинга ValueOption. В них же видно во что они переписываются:
ValueOption where(HasValue=true, Value=value)
Вот примеры использования:
def Plus(x : ValueOption[int], y : ValueOption[int])
{
| (VSome(x), VNone) => x
| (VNone, VSome(y)) => y
| (VSome(x), VSome(y)) => x + y
}
Тоже самое без расширений:
def Plus(x : ValueOption[int], y : ValueOption[int])
{
| (ValueOption where(HasValue=true, Value=x), ValueOption where(HasValue=false)) => x
| (ValueOption where(HasValue=false), ValueOption where(HasValue=true, Value=y)) => y
| (ValueOption where(HasValue=true, Value=x), ValueOption where(HasValue=true, Value=y)) => x + y
}
и аналог для встроенного (вариантного) опшона:
def Plus(x : optin[int], y : optin[int])
{
| (Some(x), None) => x
| (None, Some(y)) => y
| (Some(x), Some(y)) => x + y
}
ОбъяснениеАвтор: VladD2
Дата: 22.11.11
проходящего.
V>Но ведь именно в случае Optional объявление предварительно "пустого" extractedValue убивает всю идею на корню.
V>Не видишь разве сам?
Вижу, что ты в очередной раз трепишься вместо того, чтобы просто спросить у знающих людей. Та же фигня у тебя с GLR и всем остальным.