В отличие от конструкции select case
, где вы можете сгруппировать несколько тестов в одном и том же случае, в конструкции select type
такой возможности нет.
Причина в том, что внутри блока каждого типа-guard, селектор (соответствующая переменная или выражение) будет иметь тот же тип, который указан в операторе type-guard, и не будет там полиморфным.Вот как вы можете иметь динамическое разрешение типов в Fortran, которое статически типизировано.
select type (var)
type is (t1_t)
! Here, type of var is t1_t, and you can call
! procedures that use type(t1_t) as arguments with var
type is (t2_t)
! Here, type of var is t2_t, and procedures expecting
! type(t1_t) as arguments won't work with var
...
end select
Следовательно, компилятор не может позволить вам группировать много типов в одном типе-защитнике, потому что это незнать, какой динамический тип применить к селектору.
В качестве примечания, в отличие от выбора переключателя в языках, производных от c, конструкции select в Fortran не пропускают через , т. е. после совпаденияв Фортране выполняется соответствующий блок, и элемент управления выходит из конструкции.
Как сказал @cup, вы можете преобразовать все, что у вас общего, в различные ветви подпрограммы, чтобы избежать повторения.Но имейте в виду, что если вам нужно передать var
в процедуру, вы должны объявить ее как полиморфную пустышку.