これはむしろ、「返品」の意味に依存します。
それ自体で提供された例
t%a([1,2,5]) ! Using syntax offered by Fortran 2003
何も返さない: それはsubobjectです。そのサブオブジェクトへの参照を使用して、さまざまなことを行うことができます。
print *, t%a([1,2,5])
t%a([1,2,5]) = 27
t%a([1,2,5]) = sin(real(t%a([1,2,5])))
しかし、「戻る」という概念はまだありません。決定的に重要なのは、後で見るように、これらは表現ではありません。
質問に来て、何かを意味することができt[]
ますt()
かt{}
、答えは単に「いいえ」です。* たとえば、次のように言うことができます。
t[1,2,5] = 1
意味する
t%a[1,2,5] = 1
しかし、それは考慮すべきことではありません。
のような式を作成することができます。
print *, t%ref([1,2,5])
しかし、私たちはかなり定義不可能な領域にいます。
ただし、ポインターについて言及したように、さらに言いたいことがあります。推奨される構文t[1]
ort["first"]
は利用できませんが、タイプ バインド プロシージャのオプションはまだあります。たとえば、関数呼び出しt%ref("first")
は の最初の要素へのポインターを返すことができる場合がありますt%a
。たとえば、次のt%ref(1)
ようになります
module reference
implicit none
type custom
integer, dimension(:), allocatable :: a
contains
procedure ref
end type custom
contains
function ref(t, idx)
class(custom), target, intent(in) :: t
integer, intent(in) :: idx
integer, pointer :: ref
ref => t%a(idx)
end function ref
end module reference
use reference
implicit none
type(custom), target :: t
integer, pointer :: b
t%a = [1, 2, 3, 4, 5]
print *, t%a
b => t%ref(1) ! Fortran 2008 allows direct assignment
b = 8 ! but compiler support is very limited.
print *, t%a
end
必要に応じて、 (etc.) が受け入れられるref
ように一般的なものにすることができます。t%ref("first")
*t
ここがスカラーであるという事実に基づいています。ただし、Vladimir F がコメントで述べたように、()
意味の[]
あることをする可能性があります。1 つ目は配列に関するもので、2 つ目は共同配列に関するものです。したがって、構文が問題になりますが、この回答は構文よりもメカニズムに注目しています。