为什么在这里需要接口才能获得正确的结果

问题描述

考虑代码

public function handle() {
        $repos = GitHub::connection('main')->me()->repositories();

        foreach($repos as $repo) {
            $name = str_replace(".","-",$repo["name"]);

            Project::wherenotin('name',$name)->delete();

            DB::table('projects')
                ->updateOrInsert(
                    ['name' => $name],[
                        'name' => $name,'html_url' => $repo["html_url"],'description' => $repo["description"],'stargazers_count' => $repo["stargazers_count"],'language' => $repo["language"],]
                );
        }
}

显示npm install uuid,这当然是错误的。仅当我添加一个显式接口时,它才会输出正确的结果:

const { v4: uuidv4 } = require('uuid');

list.forEach(el=> el.id = uuidv4());

然后我得到正确的subroutine func(i) bind(c) use,intrinsic :: ISO_C_BINDING,only: c_float implicit none real(c_float),value :: i print *,i,"+","=",i + i end subroutine program main use,only: c_float implicit none real(c_float) :: i = 1.0 call func(i) end program

但这是什么导致错误?为什么需要一个不需要添加任何新信息的额外接口?

我使用gfortran,GCC版本7.4.0

解决方法

每个具有value伪参数的函数或子例程都需要一个显式接口。具有bind()属性的过程也是如此。否则,调用代码不知道如何正确调用它。

Fortran 2018草案规定:

15.4.2.2 显式界面
1在过程标识符的范围内,该过程应具有显式接口(如果存在) 不是声明函数,
...
(3)程序有 假参数(a)具有ALLOCATABLE,ASYNCHRONOUS,OPTIONAL, POINTER,TARGET, VALUE 或VOLATILE属性,...
...
(6)该过程具有 BIND 属性。

请注意,explicit interface与您使用的interface块不同。接口块是如何提供显式接口的可能方式之一。更好的选择通常是使用模块,有时使用内部过程。

该标准将显式接口定义为:

3.90.2
明确的界面
过程的接口,包括该过程的所有特征以及其伪参数的名称 星号虚拟参数(15.4.2)除外

这与interface块的形式不同,后者是以interface关键字开头的实际代码。