动态语言允许使用仅在运行时才知道的变量的值进行调度和调用。Perl 中的对比示例:
类名
持续的
Foo::Bar->some_method Foo::Bar::->some_method 'Foo::Bar'->some_method
这些都是相同的,除了第一个是边缘情况。如果在作用域中定义了具有该名称的子例程,则分派发生在其返回值上,这会导致难以理解的错误。引用的版本总是安全的。
动态的
my $class_name = 'Foo::Bar'; $class_name->some_method
方法名称
持续的
Some::Class->foo_bar
动态的
my $method_name = 'foo_bar'; Some::Class->$method_name
函数名
持续的
foo_bar; (\&foo_bar)->()
动态的
my $function_name = 'foo_bar'; (\&$function_name)->()
我想知道,变量名没有符号(通常或根本没有)的语言如何处理这些问题,特别是他们的语言设计者如何消除以下歧义?
- 解析类名
FooBar.some_method
,其中类FooBar
可能是名称文字或值为类名的变量 - 调度到
SomeClass.foo_bar
where 方法foo_bar
可能是名称文字或值为方法名称的变量 - 调用
foo_bar
函数可能是名称文字或值为函数的变量
我主要对这个问题的标签中提到的三种语言感兴趣,但如果你知道另一种没有符号的动态语言,你也可以回答。