{"id":101,"date":"2007-12-15T15:27:34","date_gmt":"2007-12-15T15:27:34","guid":{"rendered":"http:\/\/byteblog.internetallee.de\/?p=101"},"modified":"2007-12-15T15:27:34","modified_gmt":"2007-12-15T15:27:34","slug":"prototypenarger","status":"publish","type":"post","link":"https:\/\/blogs.internetallee.de\/byteblog\/2007\/12\/15\/prototypenarger\/","title":{"rendered":"Prototypen\u00e4rger"},"content":{"rendered":"<p>Warum Prototypen nur in den seltensten F\u00e4llen sinn machen.<\/p>\n<p>Nachdem ich vor einiger Zeit schon mal \u00fcber einen Sprachwechselfehler in einem meiner Perl Skripte gestossen bin.<\/p>\n<p>Ich hatte eine Funktion wie folgt deklariert:<\/p>\n<pre class=\"brush: perl;\">sub func1() {\n    my $var = shift;\n    ...\n}<\/pre>\n<p>Und der Perl Compiler m\u00e4kelte irgendwas vonwegen too many  arguments&#8230; Klar das () weist Perl an, das diese Funktion keine  Parameter bekommen darf. Also das () entfernt und alles war wieder gut.<\/p>\n<h3>Objekte und Prototypen<\/h3>\n<p>Dann bin ich jetzt \u00fcber eine Code Stelle gestossen, die folgendermassen als Methode in einem Objekt deklariert war:<\/p>\n<pre class=\"brush: perl;\">sub method1( $ ) {\n    my $self = shift;\n    ....\n    my $var = shift;\n    ...\n}<\/pre>\n<p>Da wollte der Autor wohl festhalten, dass diese Methode nur einen  Parameter annimmt, und hat das $var=shift sp\u00e4ter \u00fcbersehen, oder hat  sich gedacht, $self=shift w\u00fcrde vorher ausgewertet werden. Es ist aber  so, dass in Methodenaufrufen die Protoypen ignoriert werden.<\/p>\n<p>Als Funktion aufgerufen macht die method1() aber auch nicht das was  sie soll, da $self mit hoher Wahrscheinlichkeit nicht den richtigen  Inhlat hat.<\/p>\n<h3>Praktisch sind sie aber doch<\/h3>\n<p>Zum Beispiel um eine Funktion wie grep nachzubauen:<\/p>\n<pre class=\"brush: perl;\">sub my_grep(&amp;@) {\n    my ($grepper, @list) = @_;\n    my @result = ();\n    foreach (@list) {\n        push @result, $_\n          if ($grepper-&gt;());\n    }\n    return @result;\n}\n<\/pre>\n<p>Diese Funktion kann dann wie das eingebaute grep benutzt werden:<\/p>\n<pre class=\"brush: perl;\">my @odd = my_grep { $_[0] % 2 } ( 1 .. 20 );<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Warum Prototypen nur in den seltensten F\u00e4llen sinn machen. Nachdem ich vor einiger Zeit schon mal \u00fcber einen Sprachwechselfehler in einem meiner Perl Skripte gestossen bin. Ich hatte eine Funktion wie folgt deklariert: sub func1() { my $var = shift; &#8230; } Und der Perl Compiler m\u00e4kelte irgendwas vonwegen too many arguments&#8230; Klar das () [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[34,27],"class_list":["post-101","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-perl","tag-sprachen"],"_links":{"self":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/101","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/comments?post=101"}],"version-history":[{"count":0,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/posts\/101\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/media?parent=101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/categories?post=101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.internetallee.de\/byteblog\/wp-json\/wp\/v2\/tags?post=101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}