⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch11_09.htm

📁 By Tom Christiansen and Nathan Torkington ISBN 1-56592-243-3 First Edition, published August 1998
💻 HTM
字号:
<HTML><HEAD><TITLE>Recipe 11.8. Creating References to Methods (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen &amp; Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly &amp; Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:40:43Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch11_01.htm"TITLE="11. References and Records"><LINKREL="prev"HREF="ch11_08.htm"TITLE="11.7. Using Closures Instead of Objects"><LINKREL="next"HREF="ch11_10.htm"TITLE="11.9. Constructing Records"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch11_08.htm"TITLE="11.7. Using Closures Instead of Objects"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 11.7. Using Closures Instead of Objects"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch11_01.htm"TITLE="11. References and Records"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch11_10.htm"TITLE="11.9. Constructing Records"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 11.9. Constructing Records"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch11-98627">11.8. Creating References to Methods</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch11-pgfId-880">Problem<ACLASS="indexterm"NAME="ch11-idx-1000004837-0"></A><ACLASS="indexterm"NAME="ch11-idx-1000004837-1"></A></A></H3><PCLASS="para">You want to store a reference to a method.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch11-pgfId-886">Solution</A></H3><PCLASS="para">Create a closure that makes the proper method call on the appropriate object.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch11-pgfId-892">Discussion</A></H3><PCLASS="para">When you ask for a reference to a method, you're asking for more than just a raw function pointer. You also need to record which object the method needs to be called upon as the object contains the data the method will work with. The best way to do this is using a closure. Assuming <CODECLASS="literal">$obj</CODE> is lexically scoped, you can say:</P><PRECLASS="programlisting">$mref = sub { $obj-&gt;meth(@_) }; # later...  $mref-&gt;(&quot;args&quot;, &quot;go&quot;, &quot;here&quot;);</PRE><PCLASS="para">Even when <CODECLASS="literal">$obj</CODE> goes out of scope, the closure stored in <CODECLASS="literal">$mref</CODE> has captured it. Later when it's called indirectly, the correct object is used for the method call.</P><PCLASS="para">Be aware that the notation:</P><PRECLASS="programlisting">$sref = \$obj-&gt;meth;</PRE><PCLASS="para">doesn't do what you probably expected. It first calls the method on that object and gives you either a reference to the return value or a reference to the last of the return values if the method returns a list.</P><PCLASS="para">The <CODECLASS="literal">can</CODE> method from the UNIVERSAL base class, while appealing, is also unlikely to produce what you want.</P><PRECLASS="programlisting">$cref = $obj-&gt;can(&quot;meth&quot;);</PRE><PCLASS="para">This produces a code ref to the appropriate method (should one be found), one that carries no object information. Think of it as a raw function pointer. The information about the object is lost. That's why you need a closure to capture both the object state as well as the method to call.<ACLASS="indexterm"NAME="ch11-idx-1000004839-0"></A><ACLASS="indexterm"NAME="ch11-idx-1000004839-1"></A></P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch11-pgfId-918">See Also</A></H3><PCLASS="para">The discussion on methods in the Introduction to <ACLASS="xref"HREF="ch13_01.htm"TITLE="Classes, Objects, and Ties">Chapter 13</A>; <ACLASS="xref"HREF="ch11_08.htm"TITLE="Using Closures Instead of Objects">Recipe 11.7</A>; <ACLASS="xref"HREF="ch13_08.htm"TITLE="Calling Methods Indirectly">Recipe 13.7</A></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch11_08.htm"TITLE="11.7. Using Closures Instead of Objects"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 11.7. Using Closures Instead of Objects"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch11_10.htm"TITLE="11.9. Constructing Records"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 11.9. Constructing Records"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">11.7. Using Closures Instead of Objects</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">11.9. Constructing Records</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright &copy; 2002</a> O'Reilly &amp; Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -