2014-02-21 68 views
0

我發現這個代碼片段中開始perl的書(OOP上篇):爲什麼要創建perl對象屬性散列的淺表副本?

1 sub new { 
2 my ($class, $arg) = @_; 
3 my $self = bless {}, $class; 
4 $self->_initialize; 
5 
6 return $self; 
7 } 

8 sub _initialize { 
9 my ($self, $arg) = @_; 
10 my $class = ref $self; 
11 my %arg = %$arg; 
12 
13 $self->{attributes}{name} = $arg{name}; 
14 ... 
15 } 

在LINE_11,我覺得你並不真的需要創建arg裁判的淺表副本。因爲我們可以簡單地使用取消引用運算符->來獲取散列值。爲什麼創建一個淺拷貝是否有很好的理由?僅僅是爲了使代碼更具可讀性?這被認爲是perl OOP的最佳實踐嗎?

回答

3

沒有理由在那裏。可能有人害羞地使用引用。

如果使用了delete($arg{name})而不是$arg{name}(檢查意外的剩菜),那就不一樣了。

1

作者提供了一個解釋。在我發佈這個問題之前,我沒有得到它,對不起。

sub _initialize的某個地方,實際上刪除了通過的arg ref的某些鍵。 arg ref隨後用於打印帶有arg剩餘密鑰列表的消息。如果沒有創建副本,這可能會產生意想不到的副作用。