2017-02-04 202 views
1

調用方法我有方法的哈希表:perl的 - 從哈希

my %makefileMacroSimplifiers = (
    "or" =>   \&makefileSimplifyOr, 
    "and" =>  \&makefileSimplifyAnd, 
    "strip" =>  \&makefileSimplifyStrip, 
); 

sub makefileSimplifyStrip { 
    my $self = shift; 
    my $prefix = shift; 
    my $paramsRef = shift; 
... 
} 

每個方法需要$self。我所擁有的是:

$makefileMacroSimplifiers{$macroName}->($self, $macroName.$ws1, \@parms); 

這似乎是工作,但似乎有點奇怪我在$self明確地傳遞給方法。有沒有更好的方法來做到這一點,或者這是否被認爲是一種正常的編碼習慣? (我沒有找到更好的方法在網絡上做到這一點,但我想我會問,如果我沒有使用正確的搜索條件)。

+1

我認爲你必須通過'$ self'是的。也就是說,如果你是從同一個類中的另一個方法調用方法。通常當你調用方法的時候,你會得到一個祝福的對象引用(使用語法'$ obj-> method(...)'),然後你不需要傳遞'$ self'。 –

+0

你需要顯示調用方法。 '$ macroName'和'$ ws1'從哪裏來? – Borodin

+0

'$ macroName'和'$ ws1'是解析輸入文件的結果。在這種情況下,'$ macroName'將是'strip','$ ws1'是'strip'後面的空白。 (好吧,從技術上說,在一個makefile中,'strip'是一個函數而不是宏,但我試圖保持與程序中的C對應的命名一致)。 – user2766918

回答

2

您也可以調用對象的代碼ref。這樣,左邊的東西就會被傳入。

my $coderef = sub { ... }; 
$self->$coderef(@args); 

使用散列元素不會像這樣工作。

$self->$dispatch{foo}(1, 2, 3); # BOOM 

這是一個語法錯誤。所以你需要首先獲取代碼參考。 Borodin also explains this above in their comment

my %dispatch = (
    foo => sub { print "@_" }, 
); 

require HTTP::Request; 
my $obj = HTTP::Request->new; 
my $method = $dispatch{foo}; 
$obj->$method(1, 2, 3); 

我已經使用HTTP :: Request作爲任意類/對象的例子。

+0

雖然這可能不適用於哈希。我不在電腦附近,所以我現在不能確認。 – simbabque

+0

好的,謝謝。我更新了我的代碼,以這種方式做事。我很欣賞這些評論。 – user2766918