【问题标题】:Perl - chaining method callsPerl - 链接方法调用
【发布时间】:2024-01-15 10:28:01
【问题描述】:

我有一个类,想按严格的顺序链接它的方法调用,但不知道该怎么做。

# Mail.pm

package Mail;

sub new { ... }
sub inbox { ... }
sub folder { ... }
sub count { ... }

1;

以后...

use Mail;

my $mail = Mail->new;

# ok
$mail->inbox->count;
$mail->folder('Spam')->count;

# prevent calling inbox() after folder() or vice versa
$mail->inbox->folder('Spam')->count;
$mail->folder('Spam')->inbox->count;

【问题讨论】:

  • 有什么问题?

标签: perl methods method-chaining


【解决方案1】:

显然,folder 应该返回一个有计数的My::Mail::Folder 对象,并且没有inbox 方法,而inbox 应该返回一个有count 方法的My::Mail::Box 对象,但没有@987654328 @方法。

另一方面,我不确定为什么$mail->inbox->folder('Spam')->count; 有问题。

另一方面,为什么你会被方法链所吸引?

另外,请记住,Mail:: 命名空间下有一大堆 CPAN 模块,包括 Mail::Box,从长远来看,将东西放在不太可能出现的命名空间中可能会帮助您保持理智被您可能需要的 CPAN 模块践踏。

【讨论】:

  • @abra: “另一方面,为什么你会被方法链所吸引?” 我同意。这是一种非常类似于 Ruby 的方法,并且不能很好地揭示代码中正在发生的事情。底线是每个方法都必须返回一个提供链中下一个方法的对象。对于nwe,这是给定的——它将返回一个Mail 对象,该对象具有inbox 方法(但请称其为My::Mail 或Sinan 所说的类似名称,以免与现有类发生冲突)。但是inboxfolder 必须返回不同于另一个Mail 对象的东西,因为它们代表不同的东西。
最近更新 更多