2011-10-12 34 views
12

Ok chỉ để kiểm tra tình trạng quá tải không có vẻ là làm việc cho tôi. Tôi không biết nếu đó là phiên bản của perl tôi có, hoặc phiên bản của overload.pm, hoặc một cái gì đó sai trái với cách tôi đã thực hiện nó, nhưng mã này không làm việc cho tôi.Tại sao không "sử dụng quá tải" làm việc với "sử dụng không gian tên: autoclean"?

phiên bản perl

This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi 

quá tải phiên bản

perl -Moverload -e 'print "$overload::VERSION\n";' 
1.07 

Token.pm

package Token; 
use namespace::autoclean; 
use Data::Dumper; 


use Moose; 
use Moose::Util::TypeConstraints; 

use overload '+' => \&_overload_add, fallback => 1; 

    has 'secretvalue' => (is => 'rw', isa => 'Int'); 

    sub _overload_add{ 
    my ($one, $two) = @_; 
    my $value = $one->secretvalue() + $two->secretvalue(); 
    return ($value); 
    } 

chính

use strict; 
use warnings; 
use Token; 
my $t = Token->new(secretvalue => 17, key => 'x'); 
my $t2 = Token->new(secretvalue => 12, key => 'y'); 

my $x = $t + $t2; 

print $x; 

in

$VAR1 = 12900840; 

Điều tồi tệ nhất là tôi không nhận được bất kỳ cảnh báo hoặc lỗi nào trong nhật ký.

CẬP NHẬT

Nhờ Freido cho việc tìm kiếm các vấn đề. Tôi đã cập nhật các câu hỏi chỉ trong trường hợp bất cứ ai khác tình cờ về điều này.

Cộng đồng Perl/Moose có thường không sử dụng quá tải không?

Trả lời

16

namespace::autoclean là mức độ phù hợp với phép thuật overload thêm để xử lý toán tử của bạn. Các công trình sau khi bạn mong chờ:

package Token; 

use Moose; 
use Moose::Util::TypeConstraints; 

use overload '+' => '_overload_add'; 

has 'secretvalue' => (is => 'rw', isa => 'Int'); 

sub _overload_add{ 
    my ($one, $two) = @_; 
    my $value = $one->secretvalue() + $two->secretvalue(); 
    return ($value); 
} 

1; 

Một cái nhìn bình thường không tiết lộ bất cứ điều gì trong namespace::autoclean tài liệu mà các địa chỉ này, vì vậy tôi đoán nó là một tính năng không lường trước được. Một số tìm kiếm cho thấy rằng bug đã được báo cáo.

Tôi đoán nó đi xuống các ký hiệu đặc biệt mà overload thêm vào gói của bạn. Quá tải + thêm các mục nhập bảng biểu tượng (), (+OVERLOAD. Tôi đoán một số hoặc tất cả những điều này được hút bụi bởi namespace::autoclean, do đó hoàn tác quá tải của bạn.

Nếu bạn cảm thấy mạo hiểm, here's a patch cho namespace::autoclean để lọc ra các ký hiệu quá tải.

+1

+1 để tìm giải pháp sau khi tôi đập đầu vào bàn trong một hoặc hai giờ để tìm sự cố với mã MY. lỗi thư viện ngớ ngẩn! – qodeninja

+1

Đã ở đó, đã làm điều đó. :) Tôi đã khá bối rối bởi vấn đề của bạn quá cho đến khi tôi nhớ rằng 'quá tải' làm việc bằng cách chèn các biểu tượng ma thuật, và tôi tự hỏi nếu 'autoclean' đã rối tung với họ. – friedo

+3

@nodebunny, tại sao lại phàn nàn về mã của người khác khi bạn có thể viết mã của riêng mình? :) Câu hỏi này đã truyền cảm hứng cho tôi viết [namespace :: sweep] (http://search.cpan.org/~friedo/namespace-sweep/lib/namespace/sweep.pm) mà sẽ không chà đạp quá tải của bạn. Thông tin thêm [tại đây] (http://blogs.perl.org/users/mike_friedman/2011/10/announcing-namespacesweep.html). – friedo

10

Vì vậy, chiên là hoàn toàn chính xác; vấn đề nằm trong lớp heuristic :: MOP sử dụng để xác định cái gì và cái gì không phải là "phương thức". Nói chung, bất kỳ thứ gì được nhập khẩu từ gói khác không phải là một phương pháp, và quá tải về mặt kỹ thuật đủ điều kiện như vậy. Kể từ khi không gian tên :: autoclean yêu cầu Class :: MOP những gì phương pháp tồn tại cho các gói phần mềm và loại bỏ phần còn lại, autoclean mù quáng thanh trừng quá tải cùng với tất cả mọi thứ khác.

Điều này thật đáng ngạc nhiên, tôi nghĩ vậy.

MooseX::MarkAsMethods sẽ trợ giúp điều này cho các lớp học Moose; nó chạy trước autoclean và yêu cầu Moose nhận ra bất kỳ ký hiệu mã quá tải nào cho gói đó làm phương thức. Điều này phụ tùng cho họ cái rìu autoclean, và có thêm lợi thế mà bây giờ bạn có thể sử dụng quá tải trong các vai trò, tiêu thụ chúng, và có chúng "chỉ làm việc". (Công bố đầy đủ: Tôi đã viết MX :: MarkAsMethods sau khi sửa chữa autoclean của tôi đã bị từ chối 2 năm trước đây.)

Tuy nhiên, điều này không giúp ích với các lớp không phải Moose bạn có thể muốn sử dụng autoclean với ... Việc loại bỏ tình trạng quá tải bằng autoclean là, tốt nhất, một lỗ hổng trong autoclean.

+5

'flaw' là quá tốt,' namespace :: autoclean' bị hỏng do lỗi này. Sửa chữa của bạn là hoàn hảo BTW, nó là một sự xấu hổ người bảo trì đang được cứng đầu về nó. –

0

Tôi đã gặp sự cố tương tự (cố gắng quá tải "" trong trường hợp của mình), nhưng chưa có MooseX :: MarkAsMethods để hoạt động. Chưa xem xét lý do chính xác, nhưng một cách khắc phục khác là đã làm công việc là sử dụng MooseX::Role::WithOverloading (và vì tôi đã sử dụng nhiều vai trò khác nhau nên nó được lắp đặt dễ dàng).

package MyClass; 
use Moose; 
use namespace::autoclean; 
with 'MyRole'; 

package MyRole; 
use MooseX::Role::WithOverloading; 

use overload '""' => sub { ... }; 
Các vấn đề liên quan