Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Perl5中的OO范式和封装实例变量_Oop_Variables_Instance_Perl - Fatal编程技术网

Oop Perl5中的OO范式和封装实例变量

Oop Perl5中的OO范式和封装实例变量,oop,variables,instance,perl,Oop,Variables,Instance,Perl,我需要一种在Perl中生成真正封装的变量的方法,而不使用任何框架(如Moose),这样您就只能通过getter和setter访问实例变量。应该有私有实例变量 子例程和方法都不是问题,因为您可以定义它们,以便仅通过实例和引用使用它们。但是变量总是可以通过包名访问,比如类变量 有什么方法可以防止这种情况发生吗?要实现真正的私有变量,您应该使用闭包: { my $x; sub get { return $x; } sub set {

我需要一种在Perl中生成真正封装的变量的方法,而不使用任何框架(如Moose),这样您就只能通过getter和setter访问实例变量。应该有私有实例变量

子例程和方法都不是问题,因为您可以定义它们,以便仅通过实例和引用使用它们。但是变量总是可以通过包名访问,比如类变量


有什么方法可以防止这种情况发生吗?

要实现真正的私有变量,您应该使用闭包:

{
    my $x;

    sub get {
        return $x;
    }

    sub set {
        $x =  shift;
    }
}

set( 3 );
print get(); # prints 3
print $x; # ERROR

# Example with objects
package Class;

sub new {
    bless {}, 'Class';
}
{
    my $storage =  {};

    sub get {
        $self =  shift;
        return $storage->{ "$self" };            
    }

    sub set {
        $self =  shift;
        $storage->{ "$self" } =  shift;
    }
}

package main;
print Class::x; #ERROR

$z = Class::new();
$z->set( 3 );

$y = Class::new();
$y->set( 5 );
print $y->get(); # 5
print $z->get(); # 3
$x
是块的本地代码。只有
set
get
可以访问它。
“$self”类似于“Class=HASH(0x1cf9160)”。因为每个对象在内存中都有自己的地址,“$self”永远不会冲突


但实际上,在另一种情况下,您不需要这样做,因为这将是车轮上的一根棍子

要执行真正的私有变量,您应该使用闭包:

{
    my $x;

    sub get {
        return $x;
    }

    sub set {
        $x =  shift;
    }
}

set( 3 );
print get(); # prints 3
print $x; # ERROR

# Example with objects
package Class;

sub new {
    bless {}, 'Class';
}
{
    my $storage =  {};

    sub get {
        $self =  shift;
        return $storage->{ "$self" };            
    }

    sub set {
        $self =  shift;
        $storage->{ "$self" } =  shift;
    }
}

package main;
print Class::x; #ERROR

$z = Class::new();
$z->set( 3 );

$y = Class::new();
$y->set( 5 );
print $y->get(); # 5
print $z->get(); # 3
$x
是块的本地代码。只有
set
get
可以访问它。
“$self”类似于“Class=HASH(0x1cf9160)”。因为每个对象在内存中都有自己的地址,“$self”永远不会冲突


但实际上,在另一种情况下,您不需要这样做,这将成为车轮上的一根棍子

听起来您试图阻止人们通过访问器以外的方式访问实例变量;是这样吗

Perl是一种面向有礼貌的人的语言,你阻止程序员做你不想让他们做的事情的方法就是要求他们不要做。是的,有黑客,这里最明显的一个就是将每个对象都作为一个闭包(),但是几乎总是有办法绕过它们,所以你无法阻止这个决意无礼的黑客

其中之一就是这个,这很好地解释了我的观点

Perl并不迷恋强制隐私。它宁愿你不去它的客厅,因为你没有被邀请,而不是因为它有一把猎枪


听起来你试图阻止人们访问实例变量,而不是通过访问器;是这样吗

Perl是一种面向有礼貌的人的语言,你阻止程序员做你不想让他们做的事情的方法就是要求他们不要做。是的,有黑客,这里最明显的一个就是将每个对象都作为一个闭包(),但是几乎总是有办法绕过它们,所以你无法阻止这个决意无礼的黑客

其中之一就是这个,这很好地解释了我的观点

Perl并不迷恋强制隐私。它宁愿你不去它的客厅,因为你没有被邀请,而不是因为它有一把猎枪


人们试图用由内而外的物体来达到这种目的。很好地解释了这一点:

  • 2002年,荷兰Perl黑客Abigail首次提出了Inside-out对象

  • 2002年春天——阿姆斯特丹下午一点第一次提到

  • 2002年6月28日–YAPC NA“两种面向对象的替代方法”

  • 2002年7月1日——第一次提到帕尔蒙克斯

  • 最近,随着Damian Conway的Perl最佳实践的发布,作为推荐的最佳实践而受到关注(臭名昭著?)

  • 尽管它们有好处,但它们带来了巨大的复杂性,并没有受到普遍欢迎

有许多方法试图促进这种类型的编程

我觉得它们相当笨重,而且从那以后就不受欢迎了

您还可以在中找到它们:

在过去,Perl社区试验了一种称为“由内而外对象”的技术。由内而外对象将其数据存储在对象引用之外,并根据对象的唯一属性(如其内存地址)而不是对象本身编制索引。这具有强制对象属性封装的优点,因为它们的数据不存储在对象本身中

这种技术流行了一段时间(并在Damian Conway的Perl最佳实践中得到了推荐),但从未得到普遍采用。CPAN上的
Object::InsideOut
模块提供了此技术的全面实现,您可以在野外看到它或其他InsideOut模块


人们试图用由内而外的物体来达到这种目的。很好地解释了这一点:

  • 2002年,荷兰Perl黑客Abigail首次提出了Inside-out对象

  • 2002年春天——阿姆斯特丹下午一点第一次提到

  • 2002年6月28日–YAPC NA“两种面向对象的替代方法”

  • 2002年7月1日——第一次提到帕尔蒙克斯

  • 最近,随着Damian Conway的Perl最佳实践的发布,作为推荐的最佳实践而受到关注(臭名昭著?)

  • 尽管它们有好处,但它们带来了巨大的复杂性,并没有受到普遍欢迎

有许多方法试图促进这种类型的编程

我觉得它们相当笨重,而且从那以后就不受欢迎了

您还可以在中找到它们:

在过去,Perl社区试验了一种称为“由内而外对象”的技术。由内而外对象将其数据存储在对象引用之外,并根据对象的唯一属性(如其内存地址)而不是对象本身编制索引。这具有强制对象属性封装的优点,因为它们的数据不存储在对象本身中

这种技术流行了一段时间(并在Damian Conway的Perl最佳实践中得到了推荐),但从未得到普遍采用。CPAN上的
Object::InsideOut
模块提供了该技术的全面实现,您可以在