在Perl中,散列和祝福引用之间的根本区别是什么?

我是 Perl 的新手,我想了解/了解更多关于 OO 部分的信息。假设我有一个只有属性的“类”;创建包和祝福散列比直接处理散列有什么好处/优势?

为简单起见,让我们考虑以下示例:

package Person;

sub new {
    my $class = shift;
    my $args = {Name => '', Age => 0, @_};
    
    my $self = { Name => $args->{Name},
                 Age => $args->{Age}, };
    
    bless $self, $class;
}


package main;

my $person1 = Person->new(Name => 'David', Age => 20);
my $person2 = {Name => 'David', Age => 20, Pet => 'Dog'};

print $person1->{Name} . "n";
print $person2->{Name} . "n";

我想知道的是,除了 OO 部分之外,除了 1 是有福散列而 2 是散列引用这一事实之外,$person1and之间有什么区别$person2

在这种情况下,与处理哈希相比,使用对象有什么好处吗?

查看答案后:

感谢所有帮助:)

Håkon Hægland 评论对我来说是最接近的答案,我只是想知道,考虑我只需要持有,简单的标量,没有特殊的检查,没有其他功能,一个类是否比简单的散列有好处(我明白,如果我需要额外的功能和继承一个类将是正确的工具)

回答

$person1是被祝福的参考。为了创建对象,Perl 将引用的数据与包名相关联。当您将该引用视为一个对象时,Perl 使用该包名称来查找方法。

$person2 只是一个参考。

由于两者仍然只是引用,您仍然可以将每个都视为引用。这就是为什么这仍然有效:

print $person1->{Name} . "n";
print $person2->{Name} . "n";

你使用哪一个取决于你用它做什么。工具在上下文之外没有效用。

您可以阅读有关面向对象思想的整本书(其中很多)。使用普通散列,你需要一个键,你会得到一个值。使用面向对象的接口,您可以使用方法要求对象为您做某事。这可能会返回一个值,或者做任何你喜欢的事情。您不必知道对象如何工作。

该接口可以稳定,而底层数据或结构可以改变。使用普通散列,您的程序必须知道散列结构的变化。

在简单的示例中,例如您展示的示例,您看不到太多好处,因为您将接口直接映射到结构。如果您查看更复杂的示例(例如复杂的 Perl 模块),您会发现您可以访问的内容并没有直接映射到它们使用的数据结构上。

例如,假设您的任务的某些部分根据某人的年龄(例如有关存储人们数据的各种法律或法规)来分离任务。也许你有一个方法is_underage

if( $person2->is_underage ) { ... }

您不一定将其存储为一个硬性答案,特别是因为该年龄可能因司法管辖区和活动而异。但是,不知何故,模块计算出来了。这就是界面的重点:隐藏复杂性。

例如,请参阅脚本如何成为模块。在一个扩展示例中,我从一些简单的事情开始,但随着问题变得更加复杂,我开始四处移动并最终得到一个模块。但是,这个故事的一部分是认识到一个对象何时可以使事情变得更简单。

这是你凭经验得出的结论。两种方式都试试。寻找你在任何一种方式下工作都太努力的线索。例如,有些人已经推荐了 Moo,但请考虑是否需要引入模块来做一些简单的事情。同样,如果您正在制作一个大型系统,那么框架可能是合适的。

有很多人在争论完全遵循 OO,但也有一个同样(错误的 :)阵营一直在争论裸数据结构。函数式和面向对象的风格不一定是敌人,尤其是在 Perl 中。


以上是在Perl中,散列和祝福引用之间的根本区别是什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>