取消绑定perl对象是一种可怕的设计吗?

取消绑定perl对象是一种可怕的设计吗?,perl,bless,Perl,Bless,Perl对象是否意味着设计糟糕? 如果是,有人能给我解释一下吗? 顺便说一句,这是引发这个问题的原因,请查看关于这个问题的评论需要unbless肯定会引起注意。因为您仍然可以使用对象作为原始数据结构,所以几乎不需要它 对于接收未删减的散列引用和对象比较挑剔的模块往往有一些不那么挑剔的选项,例如在JSON中允许和转换 需要unbless肯定会让人大吃一惊。因为您仍然可以使用对象作为原始数据结构,所以几乎不需要它 对于接收未删减的散列引用和对象比较挑剔的模块往往有一些不那么挑剔的选项,例如在JSON

Perl对象是否意味着设计糟糕?
如果是,有人能给我解释一下吗?

顺便说一句,这是引发这个问题的原因,请查看关于这个问题的评论

需要
unbless
肯定会引起注意。因为您仍然可以使用对象作为原始数据结构,所以几乎不需要它


对于接收未删减的散列引用和对象比较挑剔的模块往往有一些不那么挑剔的选项,例如在JSON中允许和转换

需要
unbless
肯定会让人大吃一惊。因为您仍然可以使用对象作为原始数据结构,所以几乎不需要它


对于接收未删减的散列引用和对象比较挑剔的模块往往有一些不那么挑剔的选项,例如在JSON中允许和转换

这是一个无聊而愚蠢的问题。您对
unbless
没有任何目的,而是从一个晦涩难懂的CPAN模块中随机选择了它,询问它为什么反映了糟糕的设计。您还可以询问如何取消声明使用
my
声明的变量。这在XS代码中也是很可能的,但我希望这显然相当愚蠢

我在
unbless
中遇到的问题是,您创建了一个数据结构——从标量变量或文件句柄到嵌套哈希或数组——并调用了
bless
,以便Perl知道如何解析对该对象的方法调用

因此,现在您希望
取消禁用它。这将使数据保持不变,主要区别在于任何方法调用现在都将导致致命错误

Can't call method ... on unblessed reference

那么,你的
无扣
是为了什么?如果您依赖Perl来产生此致命错误,那么将
unde
分配给导致此致命错误的对象也同样容易

Can't call method ... on an undefined value
但是它的优点是,您的数据结构可能会被破坏,从而释放内存


如果你想要更可靠的东西,因为引用可能会传递到代码的多个部分,
unbless
就是一个例子,比我更多的人会怀疑这个例子。您对
unbless
没有任何目的,而是从一个晦涩难懂的CPAN模块中随机选择了它,询问它为什么反映了糟糕的设计。您还可以询问如何取消声明使用
my
声明的变量。这在XS代码中也是很可能的,但我希望这显然相当愚蠢

我在
unbless
中遇到的问题是,您创建了一个数据结构——从标量变量或文件句柄到嵌套哈希或数组——并调用了
bless
,以便Perl知道如何解析对该对象的方法调用

因此,现在您希望
取消禁用它。这将使数据保持不变,主要区别在于任何方法调用现在都将导致致命错误

Can't call method ... on unblessed reference

那么,你的
无扣
是为了什么?如果您依赖Perl来产生此致命错误,那么将
unde
分配给导致此致命错误的对象也同样容易

Can't call method ... on an undefined value
但是它的优点是,您的数据结构可能会被破坏,从而释放内存


如果您想要更可靠的东西,因为引用可能会传递到多个代码段,
unbless
就是一个例子,它会被比我更多的人怀疑

一个应用程序是作为哈希引用实现的对象,您也希望
%{}
dereference操作符[EDIT:您还希望支持早于v5.10.1的PERL,否则您应该直接使用。]

现在,对于任何类型为
foo
$foo
,尝试访问
$foo->{$key}
之类的元素将调用重载的
%{}
方法,访问将失败

解决方法是在访问对象的成员时临时更改对象的类型,完成后再更改。您可以通过解除对象的负担来实现这一点,但更经常(也更容易)通过将对象赋给垃圾值来实现

sub Foo::bar {   # access 'bar' member of Foo object
  my $self = shift;
  # $self->{bar} will invoke Foo::{'%{}'}, and we don't wan't that

  my $ref = ref $self;
  unbless($self);    #   or  bless $self, 'Not::An::Object::Name'
  # now $self->{bar} is accessible

  my $value = $self->{bar};
  bless $self, $ref;        # restore object type
  return $value;
}
另一个例子在关于



另一个例子是,我使用这个模式。

一个应用程序是作为哈希引用实现的对象,您也希望
%{}
dereference操作符[EDIT:您还希望支持早于v5.10.1的PERL,否则您应该直接使用。]

现在,对于任何类型为
foo
$foo
,尝试访问
$foo->{$key}
之类的元素将调用重载的
%{}
方法,访问将失败

解决方法是在访问对象的成员时临时更改对象的类型,完成后再更改。您可以通过解除对象的负担来实现这一点,但更经常(也更容易)通过将对象赋给垃圾值来实现

sub Foo::bar {   # access 'bar' member of Foo object
  my $self = shift;
  # $self->{bar} will invoke Foo::{'%{}'}, and we don't wan't that

  my $ref = ref $self;
  unbless($self);    #   or  bless $self, 'Not::An::Object::Name'
  # now $self->{bar} is accessible

  my $value = $self->{bar};
  bless $self, $ref;        # restore object type
  return $value;
}
另一个例子在关于



另一个例子是,我使用这种模式。

我无法想象您为什么要这样做。作为原始问题的开始,你大概有一个想法?如果是这样的话,如果你能解释一下,那就很有用了it@Borodin,为了避免这个问题,我在另一个线程中打开了这个问题。我需要从设计的角度理解为什么应该避免(应该吗?)。不询问具体情况。我需要知道为什么我应该避免使用它?i、 e.业绩问题?还是设计问题?还是我错过的另一件事。。。如果你能在回复中详细阐述这个话题,那就太好了。谢谢:)@AshrafBashir设计问题,因为该语言甚至不支持它(使用C代码扰乱解释器的数据结构不算)。我无法想象你为什么要这样做。作为原始问题的OP,假定