2

在 Ruby 中,当我们简单地定义一个方法时:

def test
  puts "test!"
end

它变成了一个全局对象的方法(没有独立的函数),我们甚至可以这样做:

puts self

或者

puts methods.sort

因为全局环境本身就是一个对象...

这对 Python 和/或 Perl 有效吗?如果没有,可以模拟吗?

编辑

我是编译器爱好者。

我实际上是在尝试为这三种使用 Objective-C 运行时的命名空间版本的语言实现编译器。我试图弄清楚如何在另一种语言上访问以一种语言定义的方法/类/对象。类层次结构应该完全不同,但如果全局定义的方法(就像我在 Ruby 中展示的那样)可以直接相互访问,透明地,这将非常有用,所以这就是为什么我试图弄清楚 Perl 和 Python 如何对待这样的事情与Ruby相比。我也很感激这个问题的建议。

虽然这个问题也应该与其他人相关,但我相信/希望。:)

4

8 回答 8

3

在 perl 中,事物将存储在包含包的符号表中(并且除 main 之外的所有包本身都包含在 main 的符号表中)。

%main:: 是主包表。包表中的值通常是 glob,但有时是其他东西(例如,前向声明的原型)。

更新:我看到您现在在问题中描述了您的实际目标。在我看来,您想阅读perlcall。除非您想在 Objective C 中实际翻译和编译 perl 代码(一个非常困难的项目),在这种情况下,您可能希望从PPI::Dumper的修改版本开始为您处理解析。

于 2013-11-12T21:57:05.883 回答
2

在 Perl 中,UNIVERSAL类是所有其他类的基础。

sub UNIVERSAL::method { ... }

$obj->method()     # Works regardless of the object's class
$class->method()   # Works regardless of the class name

这通常是您想要避免的。

如果您使用的是 Moose 对象系统,您可以将该方法放在您分配给应该具有该方法的类的角色中。

于 2013-11-12T21:55:40.450 回答
2

Perl 不是像 Ruby 那样的纯面向对象语言。所以不是一切都是对象,函数也不一定是方法。

在 Perl 中,谈论包(大致相当于命名空间)更有意义。Perl 5 中没有全局变量;一切都属于一个包。如果你不另外说,它会放在一个名为main.

于 2013-11-12T21:58:41.187 回答
1

在 Python 中,它是内置函数globals(),它返回所有全局定义对象的字典。虽然不知道 Perl。

要获取所有全局定义的类的列表,您可以使用类型检查:

import inspect
def test(): pass
class test2: pass
print filter(lambda x: inspect.isclass(x[1]), globals().items())
于 2013-11-12T21:52:31.807 回答
1
def teas():
    return "hello"


print locals() # or globals()
# prints
{'__builtins__': <module '__builtin__' (built-in)>, 'teas': <function teas at 0xb72b4ae4>, '__file__': '/home/user/test.py', '__package__': None, '__name__': '__main__', '__doc__': None}
于 2013-11-12T21:52:35.083 回答
1

在 Python 中,也有全局变量和局部变量。例如:

def say_hey_2():   
    global hey
    hey= 'hey!'
    print hey, hey

将打印全局 hey 和 local hey。

于 2013-11-12T21:52:43.593 回答
1

在 Python 中,当您定义“全局”时,您实际定义的是您当前所在的任何模块的属性(__main__如果代码位于正在执行的“顶级”脚本中,则为模块)。

所以没有程序范围的全局环境,尽管名称globals()在不同的文件中返回不同的对象。

您可以通过 访问模块sys.modules,但此集合不一定完整。如果您reload是一个模块,那么如果从其他任何地方引用旧版本以及其中定义的任何功能,旧版本都会保留下来。但是已经不在了sys.modules

于 2013-11-12T22:51:00.753 回答
1
>>> def test():
...     print 'test!'
... 
>>> print test
<function test at 0x279ec80>
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'test': <function test at 0x279ec80>, '__doc__': None, '__package__': None}
>>> print globals()['test']
<function test at 0x279ec80>
于 2013-11-12T21:57:38.853 回答