如何从函数中访问父变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从函数中访问父变量相关的知识,希望对你有一定的参考价值。

我有一个pureComp_t派生类型与组件Tcalphaalphaalpha_t派生类型。我想要在value派生类型中定义的过程alpha_t能够访问组件Tc进行一些额外的计算。

module alpha_m

    type :: alpha_t
        contains
            procedure :: value
    end type

    type pureComp_t
        real(8) :: Tc
        type(alpha_t) :: alpha
    end type

contains

    function value(this,T)
    implicit none

        class(alpha_t) :: this
        real(8) :: T
        real(8) :: value

        value = T / this%Tc

    end function

end module

program regression_alpha

    use alpha_m
    implicit none

    type(pureComp_t) :: pureComp

    pureComp%Tc = 620.d0
    write(*,*)pureComp%alpha%value(610.d0)

end program

现在,我尝试通过编写Tc获得变量this%Tc,但函数的this参数显然是指alpha_t派生类型而不是purecomp_t派生类型。

我可以通过最少的代码修改来获得对变量Tc的访问权限吗?

答案

首先,关于术语的说明:与派生类型有关的“父”通常以类型扩展而不是内容的方式理解。也就是说,在

type a
  type(b) x
end type a

人们通常不会使用“父”来描述a及其组成部分x之间的关系。

话虽如此,让我们继续讨论真正的问题。考虑一下模块

module m
  type inner
   contains
    procedure :: inner=>inner_value
  end type inner

  type outer
    type(inner) x
    real :: y=1.
  end type outer

 contains

   real function inner_value(this)
     type(inner), intent(in) :: this
     inner_value = ...
   end function

end module m

考虑一下我们想要的程序

use m
type(outer) a
print *, a%x%value()
end

和事情使inner_value可以访问a的组件。只是为了确认这没有任何意义,该计划怎么样

use m
type(inner) b
print *, b%value()   ! There's nothing containing b...
end

现在,花了很多时间来重述问题,是时候寻找解决方案了。

简单的回答是:如果我们想要访问的值不是类型绑定过程的传递伪参数类型的组件,那么我们必须以某种方式将它放在该过程的范围内。我们怎么做?

就最少修改而言,可能在模块中

real function inner_value(this, outer_x)
  type(inner), intent(in) :: this
  real, intent(in) :: outer_y
  inner_value = ...
end function

这样在程序中

print *, a%x%value(a%y)

现在,这可能会变得乏味且容易出错。怎么样

print *, a%value_of_inner()

value_of_inner()做适当的事情。

或者,如果组件alpha_t在“包含在pureComp_t中”的上下文之外没有意义,那么可以考虑使用类型扩展。

我不会充实这两种方法的细节。或者以下,因为它可能有点可怕。

考虑一下inner声明

type inner
  type(outer), pointer :: container=>null()
end type inner

然后container需要简单(和正确...)与outer类型的相关实例和参考像

real function inner_value(this)
  type(inner), intent(in) :: this
  inner_value = this%container%y
end function

这需要相当多的额外“安全”和“设置”代码。

以上是关于如何从函数中访问父变量的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数中访问父变量

使用绑定从片段访问父活动的 UI 元素

如何使用视图绑定从片段更改父活动中的视图[重复]

从片段访问父活动的数据

从子片段访问父片段方法

回调函数无法访问父函数范围内的变量