珀尔 |词法绑定和动态绑定
Perl 中的词法绑定和动态绑定是一个系统,通过该系统定义变量的值和范围,并且可以通过其各自的名称轻松找到变量。 Perl5 支持词法绑定和动态绑定
词法绑定:也称为静态绑定。绑定作用域就像语法、函数等,产生全新的表值,变量的名称按排名顺序分类,称为环境。这个绑定是在Emacs中引入的。这为最大限度地利用创造了许多机会,因此使用它的程序具有在未来版本的 Emacs 中运行得更快的优势。它们与后来添加到 Emacs 26.1 版本的并发性更加协调。词法范围意味着对词法绑定的变量的引用应该位于绑定的构造中。
词法绑定的工作:词法环境最好由绑定构造定义,它指定了构造中绑定的变量的局部值。词法环境是 Lisp 求值器首先查看变量特定值的地方。词法绑定的范围是不确定的。这意味着即使在词法环境的执行结束后,它也不会被丢弃,并且可以在调用时再次使用。
例子:
#!/usr/bin/perl
# Perl program to demonstrate
# lexical binding
{
# begin lexical scope
my $var = "GeeksforGeeks";
print "\$var is: ", (defined $var ?
$var : "Geeks"), $/;
} # end lexical scope
# Executing outside lexical scope
print "\$var is: ", (defined $var ?
$var : "Geeks"), $/;
$var is: GeeksforGeeks
$var is: Geeks
在上面的示例代码中,变量$var的范围是为特定的代码体定义的,并且在外部调用时会发生变化。这表明一旦退出词法范围,则在此词法范围内创建的任何内容都将被删除。
动态绑定:这也称为后期绑定,是词法或静态绑定的替代选项。此绑定是一个系统,程序通过该系统等待运行时完成,然后按名称绑定方法,该名称称为实际子例程。这种绑定成本更高,但同时,它也有其自身的好处,例如避免版本之间的冲突。 Java和 C++ 是可以执行动态绑定的常用语言。动态绑定中通常使用的概念是方法覆盖。
为什么要使用动态绑定?
- 更容易实施。整个概念在词汇绑定之前就被大众理解了。
- 对其他人来说更明智,也更容易理解。
例子:
#!/usr/bin/perl
# Perl program to demonstrate
# Dynamic binding
package Animal;
sub new
{
my $class = shift;
# Bless into the correct class
bless {}, $class;
}
sub method1
{
my $this = shift;
print("This is Animal class Method 1");
}
sub method2
{
my $this = shift;
print("\nThis is Animal class Method 2");
}
package cat;
our @ISA = (Animal); # cat is a subclass of Animal
sub method2
{
my $this = shift;
print("\nThis is cat class Method 1");
}
package main;
# Calls Animal::new but creates a 'cat' object
my $cat = new cat;
# Calls Animal::new but creates a 'dog' object
my $dog = new Animal;
$dog->method1(); # Calls Animal::method1
$cat->method2(); # Calls cat::method2
This is Animal class Method 1
This is cat class Method 1
在上面的示例代码中,Perl 使用 Method Overriding 的概念来执行动态绑定的操作。它显示了动态绑定如何允许在其范围之外访问类的内容。