<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Peter's Blog - Nodes for gotcha</title>
    <link>http://www.petersblog.org/</link>
    <description>Nodes containing the tag gotcha</description>
    <item>
      <title>Ruby != Python WRT default argument values</title>
      <link>http://www.petersblog.org/node/view/1548</link>
      <description>&lt;p&gt;
Found another ruby gotcha when calling methods declared with default argument values: 
&lt;/p&gt;
&lt;pre class="lazy"&gt;&lt;span class="Entity"&gt;irb&lt;/span&gt;(main):&lt;span class="Constant"&gt;004&lt;/span&gt;:&lt;span class="Constant"&gt;0&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;a&lt;/span&gt;(&lt;span class="Variable"&gt; b&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;1&lt;/span&gt;&lt;span class="Variable"&gt;,&lt;/span&gt;c&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;2&lt;/span&gt;&lt;span class="Variable"&gt;,&lt;/span&gt;d&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;3&lt;/span&gt;&lt;/span&gt;)
&lt;span class="Entity"&gt;irb&lt;/span&gt;(main):&lt;span class="Constant"&gt;005&lt;/span&gt;:&lt;span class="Constant"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; print &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;#{&lt;/span&gt;b&lt;span class="String"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;#{&lt;/span&gt;c&lt;span class="String"&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;#{&lt;/span&gt;d&lt;span class="String"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;\n&lt;/span&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="Entity"&gt;irb&lt;/span&gt;(main):&lt;span class="Constant"&gt;006&lt;/span&gt;:&lt;span class="Constant"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
=&amp;gt; &lt;span class="Constant"&gt;nil&lt;/span&gt;
&lt;span class="Entity"&gt;irb&lt;/span&gt;(main):&lt;span class="Constant"&gt;007&lt;/span&gt;:&lt;span class="Constant"&gt;0&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; a(c&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;23&lt;/span&gt;)
&lt;span class="Constant"&gt;23&lt;/span&gt; &lt;span class="Constant"&gt;2&lt;/span&gt; &lt;span class="Constant"&gt;3&lt;/span&gt;
=&amp;gt; &lt;span class="Constant"&gt;nil&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
A python programmer would have expected this to print 
&lt;/p&gt;
&lt;pre class="lazy"&gt;&lt;span class="Constant"&gt;2&lt;/span&gt; &lt;span class="Constant"&gt;23&lt;/span&gt; &lt;span class="Constant"&gt;3&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
as when calling the function we are saying we want c to be 23 and the other arguments to be left at their default values. Ruby appears to be ignoring the 'c=' bit when the function is being called so the first argument 'b' gets the value 23. 
&lt;/p&gt;
&lt;p&gt;
Pity, this python trick simplifies calling functions with lots of default parameters: you don't have to get the order of the parameters right or specify the correct default values of arguments before the one you are having to specify a value for. I should be calling this with: 
&lt;/p&gt;
&lt;pre class="lazy"&gt;&lt;span class="Entity"&gt;irb&lt;/span&gt;(main):&lt;span class="Constant"&gt;007&lt;/span&gt;:&lt;span class="Constant"&gt;0&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; a(b&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;1&lt;/span&gt;, c&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Constant"&gt;23&lt;/span&gt;)
&lt;/pre&gt;
&lt;p&gt;
i.e passing 'b=1' even though the declaration should tell ruby what the default for that should be. The 'b=' and 'c=' are only serving to help me selfdocument my code. 
&lt;/p&gt;
&lt;p&gt;
Ruby's behaviour is C/C++ish i.e. primitive. 
&lt;/p&gt;
&lt;p&gt;
UPDATE: 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://safari.oreilly.com/0596523696"&gt;O'Reilly Ruby Cookbook&lt;/a&gt;: 
&lt;/p&gt;
&lt;pre class="lazy"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;fun_with_text&lt;/span&gt;(&lt;span class="Variable"&gt;text&lt;span class="Variable"&gt;,&lt;/span&gt; args&lt;span class="Keyword"&gt;=&lt;/span&gt;&lt;span class="Variable"&gt;{&lt;/span&gt;&lt;span class="Variable"&gt;}&lt;/span&gt;&lt;/span&gt;)
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt;   text &lt;span class="Keyword"&gt;=&lt;/span&gt; text.&lt;span class="Entity"&gt;upcase&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; args[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;upcase&lt;/span&gt;]
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;   text &lt;span class="Keyword"&gt;=&lt;/span&gt; text.&lt;span class="Entity"&gt;downcase&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; args[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;downcase&lt;/span&gt;]
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;   &lt;span class="Keyword"&gt;if&lt;/span&gt; args[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;find&lt;/span&gt;] &lt;span class="Keyword"&gt;and&lt;/span&gt; args[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;replace&lt;/span&gt;]
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;     text &lt;span class="Keyword"&gt;=&lt;/span&gt; text.&lt;span class="Entity"&gt;gsub&lt;/span&gt;(args[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;find&lt;/span&gt;], args[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;replace&lt;/span&gt;])
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;   text &lt;span class="Keyword"&gt;=&lt;/span&gt; text.&lt;span class="Entity"&gt;slice&lt;/span&gt;(&lt;span class="Constant"&gt;0&lt;/span&gt;, args[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;truncate_at&lt;/span&gt;]) &lt;span class="Keyword"&gt;if&lt;/span&gt; args[&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;truncate_at&lt;/span&gt;]
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;   &lt;span class="Keyword"&gt;return&lt;/span&gt; text
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt; &lt;span class="Entity"&gt;fun_with_text&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Foobar&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, {&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;upcase&lt;/span&gt; =&amp;gt; &lt;span class="Constant"&gt;true&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;truncate_at&lt;/span&gt; =&amp;gt; &lt;span class="Constant"&gt;5&lt;/span&gt;})
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; =&amp;gt; &amp;quot;FOOBA&amp;quot;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt; &lt;span class="Entity"&gt;fun_with_text&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Foobar&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;upcase&lt;/span&gt; =&amp;gt; &lt;span class="Constant"&gt;true&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;truncate_at&lt;/span&gt; =&amp;gt; &lt;span class="Constant"&gt;5&lt;/span&gt;)
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; =&amp;gt; &amp;quot;FOOBA&amp;quot;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt; &lt;span class="Entity"&gt;fun_with_text&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;Foobar&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;find&lt;/span&gt; =&amp;gt; &lt;span class="String"&gt;&lt;span class="String"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;(&lt;/span&gt;o+&lt;span class="String"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;/&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;replace&lt;/span&gt; =&amp;gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;\1d&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;downcase&lt;/span&gt; =&amp;gt; &lt;span class="Constant"&gt;true&lt;/span&gt;)
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; =&amp;gt; &amp;quot;foodbar&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Related Posts: &lt;a href="/tag/gotcha"&gt;gotcha&lt;/a&gt; &lt;a href="/tag/noob"&gt;noob&lt;/a&gt; &lt;a href="/tag/ruby"&gt;ruby&lt;/a&gt;&lt;/p&gt;</description>
      <guid>http://www.petersblog.org/node/view/1548</guid>
      <category domain="http://www.technorati.com/tag">gotcha</category>
      <category domain="http://www.technorati.com/tag">noob</category>
      <category domain="http://www.technorati.com/tag">ruby</category>
    </item>
  </channel>
</rss>
