2013-01-11 59 views
1

我觉得这必须是重复的,但我似乎无法在任何地方找到它,并且我没有通过非常快速的Google搜索获取任何内容。在当前命名空间中更改使用关联对象的名称

有没有办法改变模块中的东西的名称,以便它不与本地(或全局)的名称冲突?考虑例如:

module namespace 
    real x !some data 
    contains 
    subroutine foo() 
    write(0,*) "foo!" 
    end subroutine foo 
end module 
subroutine foo() 
    write(0,*) "foo is the new bar :)" 
end subroutine 

program main 
    use namespace 
    real x 
    call foo() !should print "foo is the new bar" 
    call namespacefoo() !somehow call module namespace's version of foo 
end program main 

上面的代码不编译因为x没有定义。当然,如果我不想要一个名为x的局部变量,那么我可以use namespace, only: foo,但是要修改我的局部变量名似乎有点麻烦。 (作为一个方面说明,我敢肯定,我以前用的语句only部分一些神奇的看到了这一点......)


对于那些受益谁也知道蟒蛇,我在找类似Python的东西:

import namespace as other_namespace 

或者我猜,因为Fortran语言不相当有命名空间控制的该级别:

from namespace import somefunc as otherfunc 
from namespace import somedata as otherdata 

回答

4

您需要重命名:当然

[[email protected] stackoverflow]$ cat ren.f90 
module namespace 
    real x !some data 
    contains 
    subroutine foo() 
    write(0,*) "foo!" 
    end subroutine foo 
end module 
subroutine foo() 
    write(0,*) "foo is the new bar :)" 
end subroutine 

program main 
    use namespace, local_name => x, namespacefoo => foo 
    real x 
    call foo() !should print "foo is the new bar" 
    call namespacefoo() !somehow call module namespace's version of foo 
end program main 
[[email protected] stackoverflow]$ nagfor ren.f90 
NAG Fortran Compiler Release 5.3.1 pre-release(904) 
Warning: ren.f90, line 17: X explicitly imported into MAIN (as LOCAL_NAME) but not used 
Warning: ren.f90, line 17: Unused local variable X 
[NAG Fortran Compiler normal termination, 2 warnings] 
[[email protected] stackoverflow]$ ./a.out 
foo is the new bar :) 
foo! 

虽然这是更好地让事情私有的模块,如果在所有可能避免正是这种有些东西

+0

是的,那是我需要的。好建议。来自python我不习惯思考“私有”数据,但是python使*真的很容易将名称空间分开,所以它不是必须的 - 还有一些约定可以说“请不要乱用有了这个变量,除非你知道你在做什么“ – mgilson

0

看来,我应该看着更难在我的谷歌搜索:

use namespace, only: namespace_x => x, namespacefoo => foo 

“进口”的命名空间的x下的本地名称namespace_x和命名空间的本地命名空间中的子程序foonamespacefoo

为他人谋取利益的一些代码:

module namespace 
    real x !some data 
    real y 
    contains 
    subroutine foo() 
    write(0,*) "foo!" 
    end subroutine foo 
end module 

subroutine foo() 
    use namespace, only: x,y 
    write(0,*) "foo is the new bar :)" 
    write(0,*) "by the way, namespace.x is:",x 
    write(0,*) "by the way, namespace.y is:",y 
end subroutine 

program main 
    use namespace, only: namespacefoo => foo, y, z => x 
    real x 
    x = 0.0 
    y = 1.0 
    z = 2.0 
    call foo() !should print "foo is the new bar" 
    call namespacefoo() !somehow call module namespace's version of foo 
end program main 
+0

与Python的另一个细微区别是''使用命名空间,只有:z => x'类似于'从名称空间导入x作为z',只会导入和重命名'x',而您也可以'使用命名空间z => x'来导入模块'namespace'中的所有公共实体,并只重命名'x'(如Ian的答案)。 – sigma

+0

@sigma - 谢谢你指出。我没有仔细阅读伊恩的答案。 – mgilson