📜  珀尔 |词法绑定和动态绑定

📅  最后修改于: 2022-05-13 01:54:23.231000             🧑  作者: Mango

珀尔 |词法绑定和动态绑定

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 的概念来执行动态绑定的操作。它显示了动态绑定如何允许在其范围之外访问类的内容。