2017-02-06 2 views
0

Следующий код не компилируется, потому что компилятор считает, что тип выражения 'with' (U8 | None), хотя, как я не вижу, как может случиться, что это тело денешься None'с' структурой и обработкой исключений

class Disposable 
    new create() => None 
    fun dispose() => None 
    fun value(): U8 => 42 

primitive TestWith 
    fun apply(): U8 => 
    with d = Disposable do 
     d.value() 
    end 

Но если добавить раздел «другое» к «с» - все становится нормально с типами. Но компилятор жалуется, что «попытка выражения никогда не приводит к ошибке».

primitive TestWith 
    fun apply(): U8 => 
    with d = Disposable do 
     d.value() 
    else 
     0 
    end 

Любые идеи?

ответ

0

with блок гарантирует, что объект будет удален, даже если вложенные сообщения об ошибках кода. В вашем случае корпус d.value() не вызывает ошибок. В этом случае вам не нужен оператор with.

У вас есть два варианта, чтобы сделать ваш код компиляции:

а) позвонить dispose() напрямую (не выглядеть элегантно на всех):

class Disposable 
    new create() => None 
    fun dispose() => None 
    fun value(): U8 => 42 

primitive TestWith 
    fun apply(): U8 => 
    let d = Disposable 
    let result = d.value() 
    d.dispose() // dispose manually 
    result 

б) имеют частичную функцию внутри with тела:

class Disposable 
    new create() => None 
    fun dispose() => None 
    fun value(): U8? => error // partial function 

primitive TestWith 
    fun apply(): U8 => 
    with d = Disposable do 
     d.value() // possible failure here 
    end 
+0

Второй пример не будет компилироваться. Компилятор скажет: «тело функции не является типом результата», предполагая, что тип тела функции (U8 | None). Это обсуждалось на канале IRC, и вывод заключается в том, что это ошибка. Я собираюсь заполнить отчет об ошибке по этой теме. – aav

Смежные вопросы