﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-jinfeng_wang-随笔分类-2016SCALA</title><link>http://www.blogjava.net/jinfeng_wang/category/55144.html</link><description>G-G-S,D-D-U!</description><language>zh-cn</language><lastBuildDate>Fri, 16 Dec 2016 03:45:21 GMT</lastBuildDate><pubDate>Fri, 16 Dec 2016 03:45:21 GMT</pubDate><ttl>60</ttl><item><title>Scala 函数传名调用</title><link>http://www.blogjava.net/jinfeng_wang/archive/2016/12/16/432129.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Fri, 16 Dec 2016 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/jinfeng_wang/archive/2016/12/16/432129.html</guid><wfw:comment>http://www.blogjava.net/jinfeng_wang/comments/432129.html</wfw:comment><comments>http://www.blogjava.net/jinfeng_wang/archive/2016/12/16/432129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jinfeng_wang/comments/commentRss/432129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jinfeng_wang/services/trackbacks/432129.html</trackback:ping><description><![CDATA[<div>http://www.runoob.com/scala/functions-call-by-name.html<br />
<br />
<br />
<p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 13px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">Scala的解释器在解析函数参数(function arguments)时有两种方式：</p>
<ul style="border: 0px; margin: 1em 0px; padding: 0px; line-height: 16.8px; list-style: none; color: #333333; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, STHeiti, 'Microsoft Yahei', sans-serif; font-size: 12px; background-color: #ffffff;">
     <li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.2em; line-height: 1.5em; font-size: 13px; list-style-type: none; background-image: url(&quot;./assets/img/bullet@2x.png&quot;); background-size: auto 8px; background-position: 0% 0.4em; background-repeat: no-repeat;">传值调用（call-by-value）：先计算参数表达式的值，再应用到函数内部；</li>
     <li style="border: 0px; margin: 0px 0px 1em 1em; padding: 0px 0px 0px 1.2em; line-height: 1.5em; font-size: 13px; list-style-type: none; background-image: url(&quot;./assets/img/bullet@2x.png&quot;); background-size: auto 8px; background-position: 0% 0.4em; background-repeat: no-repeat;">传名调用（call-by-name）：将未计算的参数表达式直接应用到函数内部</li>
</ul>
<p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 13px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">在进入函数内部前，传值调用方式就已经将参数表达式的值计算完毕，而传名调用是在函数内部进行参数表达式的值计算的。</p>
<p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 13px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">这就造成了一种现象，每次使用传名调用时，解释器都会计算一次表达式的值。</p>
<pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; color: #333333; background: url(&quot;/images/codecolorer_bg.gif&quot;) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #000088;">object</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">Test</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #000088;">def</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> main</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">args</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">Array</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">[</span><span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">String</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">])</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> delayed</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">time</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">());</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #000088;">def</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> time</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">()</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">=</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> println</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"获取时间，单位为纳秒"</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">)</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">System</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">nanoTime </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #000088;">def</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> delayed</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> t</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">:</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">=&gt;</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">Long</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">)</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">=</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">{</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> println</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"在 delayed 方法内"</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">)</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> println</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">(</span><span style="border: 0px; margin: 0px; padding: 0px; color: #008800;">"参数： "</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">+</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> t</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">)</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> t </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">}</span></pre>
<p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 13px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">以上实例中我们声明了 delayed 方法， 该方法在变量名和变量类型使用 =&gt; 符号来设置传名调用。执行以上代码，输出结果如下：</p>
<pre prettyprinted"="" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: #dddddd; margin: 15px auto; padding: 10px 15px; font-stretch: normal; font-size: 12px; line-height: 20px; font-family: 'courier new'; white-space: pre-wrap; word-break: break-all; word-wrap: break-word; color: #333333; background: url(&quot;/images/codecolorer_bg.gif&quot;) 50% 0% #fbfbfb;"><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">$ scalac </span><span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">Test</span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">.</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;">scala $ scala </span><span style="border: 0px; margin: 0px; padding: 0px; color: #660066;">Test</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">在</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> delayed </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">方法内</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">获取时间，单位为纳秒</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">参数：</span> <span style="border: 0px; margin: 0px; padding: 0px; color: #006666;">241550840475831</span><span style="border: 0px; margin: 0px; padding: 0px; color: #000000;"> </span><span style="border: 0px; margin: 0px; padding: 0px; color: #666600;">获取时间，单位为纳秒</span></pre>
<p style="border: 0px; margin: 0px; padding: 0px; line-height: 2em; font-size: 13px; font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; color: #333333; background-color: #ffffff;">实例中 delay 方法打印了一条信息表示进入了该方法，接着 delay 方法打印接收到的值，最后再返回 t。</p>
</div>
<img src ="http://www.blogjava.net/jinfeng_wang/aggbug/432129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2016-12-16 11:42 <a href="http://www.blogjava.net/jinfeng_wang/archive/2016/12/16/432129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>