gpt4 book ai didi

perl - 是否有 Perl 模块或技术可以更轻松地使用长 namespace ?

转载 作者:行者123 更新时间:2023-12-04 00:45:24 25 4
gpt4 key购买 nike

一些命名空间很长而且很烦人。假设我下载了名为 FooFoo-BarBar-BazBaz.tar.gz 的假设包,它具有以下模块:

FooFoo::BarBar::BazBaz::Bill
FooFoo::BarBar::BazBaz::Bob
FooFoo::BarBar::BazBaz::Ben
FooFoo::BarBar::BazBaz::Bozo
FooFoo::BarBar::BazBaz::Brown
FooFoo::BarBar::BazBaz::Berkly
FooFoo::BarBar::BazBaz::Berkly::First
FooFoo::BarBar::BazBaz::Berkly::Second

有没有我可以使用的类似于 C++ 'using' 语句的模块或技术,即有没有我可以做的方法
using FooFoo::BarBar::BazBaz;

然后让我做
my $obj = Brown->new();

ok $obj->isa('FooFoo::BarBar::BazBaz::Brown') ; # true
# or...
ok $obj->isa('Brown'); # also true

最佳答案

aliased编译指示这样做:

use aliased 'FooFoo::BarBar::BazBaz::Bill';

my $bill = Bill->new;
aliased是语法糖
use constant Bill => 'FooFoo::BarBar::BazBaz::Bill';
# or
sub Bill () {'FooFoo::BarBar::BazBaz::Bill'}

这样做的缺点是包名称作为参数的正常使用是通过带引号的字符串完成的:
$obj->isa('FooFoo::BarBar::BazBaz::Bill')

但是常量子程序需要是一个简单的词:
$obj->isa(Bill);

这似乎是一个等待发生的错误。

或者,您可以只使用 Perl 对命名空间别名的内置支持:
package Foo::Bar::Baz::Bill;

sub new {bless {}}

package Foo::Bar::Baz::Tom;

sub new {bless {}}

package main;

BEGIN {*FBB:: = *Foo::Bar::Baz::} # the magic happens here

say FBB::Bill->new; # Foo::Bar::Baz::Bill=HASH(0x80fd10)

say FBB::Tom->new; # Foo::Bar::Baz::Tom=HASH(0xfd1080)

关于 ->isa('shortname')要求,别名 stash 方法照常使用带引号的字符串:
my $obj = FBB::Bill->new;

say $obj->isa('FBB::Bill'); # prints 1
say $obj->isa('Foo::Bar::Baz::Bill'); # prints 1

编译时别名 BEGIN {*short:: = *long::package::name::} 的效果在所有包和范围内都是全局的。只要您选择一个空包作为别名就可以了。

关于perl - 是否有 Perl 模块或技术可以更轻松地使用长 namespace ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5035542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com