<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Tag konferencja</title>
    <link>http://blog.zabiello.com/articles/tag/konferencja</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Po wideokonferencji z Matzem</title>
      <description>&lt;p&gt;&lt;a href="http://blog.zabiello.com/articles/2008/02/15/wideokonferencja-z-matzem"&gt;Zapowiadana wcze&#347;niej&lt;/a&gt; wideokonferencja z tw&#243;rc&#261; j&#281;zyka Ruby, zosta&#322;a dobrze przygotowana przez Google. Obraz by&#322; wy&#347;wietlany na du&#380;ym ekranie, i co wa&#380;niejsze mo&#380;na by&#322;o zadawa&#263; pytania prelegentowi i uda&#322;o mi si&#281; nawet dwa zada&#263;. :)&lt;/p&gt;


	&lt;p&gt;Prawd&#281; m&#243;wi&#261;c oczekiwa&#322;em &#380;e Matz powie co&#347; nowego. Nic takiego nie by&#322;o. Mam wra&#380;enie &#380;e nawet slajdy jakie by&#322;y wy&#347;wietlane gdzie&#347; ju&#380; wcze&#347;niej widzia&#322;em. Moim zdaniem, Matz m&#243;wi tak s&#322;abo po angielsku, &#380;e powinien m&#243;wi&#263; w swoim j&#281;zyku, po japo&#324;sku, i korzysta&#263; z t&#322;umacza. Nie s&#261;dz&#281; &#380;e by&#322;oby wolniej, a nie trzeba by by&#322;o te&#380; powtarza&#263; po kilka razy tego samego pytania.&lt;/p&gt;


	&lt;p&gt;Zapyta&#322;em si&#281; go, czy istnieje jaka&#347; oficjalna specyfikacja j&#281;zyka Ruby (lub co&#347; podobnego do pythonowej publicznej &lt;a href="http://www.python.org/dev/peps/"&gt;listy proponowanych ulepsze&#324;&lt;/a&gt;). Brak jednego i drugiego powoduje, &#380;e jest pewne zamieszanie co do sk&#322;adni jaka ma wej&#347;&#263; do Rubiego 2.0. Tak naprawd&#281; to nikt nie wie w jakim kierunku ta sk&#322;adnia pod&#261;&#380;a. Np. nie wiadomo czy &lt;a href="http://www.rubyist.net/~matz/slides/rc2003/"&gt;wcze&#347;niej prezentowane przez Matza slajdy&lt;/a&gt; to tylko takie lu&#378;ne my&#347;li, czy te&#380; jakie&#347; powa&#380;ne propozycje. Nie wiadomo te&#380;&#160;czy cokolwiek z takich &amp;#8220;pomys&#322;&#243;w&amp;#8221; jest dyskutowane w jakim&#347; szerszym gronie poza w&#261;sk&#261; grup&#261; japo&#324;skich samuraj&#243;w (rozmawiaj&#261;cych oczywi&#347;cie tylko po japo&#324;sku).&lt;/p&gt;


	&lt;p&gt;Matz powiedzia&#322; &#380;e jaka&#347; specyfikacja j&#281;zyka jest tworzona przez grup&#281; tworz&#261;c&#261; projekt &lt;a href="http://rubini.us/"&gt;Rubiniusa&lt;/a&gt; i &#380;e jest z nimi w kontakcie. Widz&#281;, &#380;e Matz zaczyna si&#281; z kim&#347; liczy&#263;. To bardzo dobrze. Bo Ruby nie jest taki ca&#322;kiem m&#322;ody (jest w tym samym wieku co Java i tylko rok m&#322;odszy od Pythona) i ju&#380; dawno przesta&#322; by&#263; tylko prywatnym j&#281;zykiem Matza do zabawy.&lt;/p&gt;


	&lt;p&gt;Zapyta&#322;em si&#281; Matza te&#380; o kwesti&#281; sk&#322;adni tzw. &lt;em&gt;named parameters&lt;/em&gt; w Rubim. Czy ju&#380; jest jaka&#347; ustalona sk&#322;adnia i dlaczego po prostu nie skopiuje dobrego i przejrzystego rozwi&#261;zania jakie wyst&#281;puje od dawna w Pythonie? Dla tych co nie znaj&#261; Pythona, przypominam, &#380;e chodzi o wygodne wywo&#322;ywanie funkcji  z parametrami wyst&#281;puj&#261;cymi w dowolnej kolejno&#347;ci. Najlepiej zobaczy&#263; to na przyk&#322;adzie.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;b&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;D&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;**&lt;/span&gt;&lt;span class="ident"&gt;kwargs&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
  &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;b&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;kwargs&lt;/span&gt;
&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;  &lt;span class="comment"&gt;# =&amp;gt; 1 2 C D () {}&lt;/span&gt;
&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 2 C 3 () {}&lt;/span&gt;
&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;5&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;6&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 2 3 4 (4, 5, 6, 7) {}&lt;/span&gt;
&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;DE&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;foo&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;blah&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 2 C DE () {'foo': 'blah'}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Parametry a i b s&#261; obligatoryjne, c i d posiadaj&#261; domy&#347;lne warto&#347;ci. &lt;code&gt;*args&lt;/code&gt; to lista dowolnych parametr&#243;w (mo&#380;na dzi&#281;ki temu wywo&#322;ywa&#263; funkcj&#281; z dowolnie wielk&#261; liczb&#261; parametr&#243;w). Za&#347; &lt;code&gt;**kwargs&lt;/code&gt; to s&#322;ownik pozwalaj&#261;cy na dodanie dowolnej ilo&#347;ci kolejnych &lt;em&gt;named parameters&lt;/em&gt;. W Pythonie jest to dosy&#263; czytelne i &#322;atwe do zrozumienia.&lt;/p&gt;


	&lt;p&gt;W Ruby sytuacja wygl&#261;da troch&#281; inaczej. Z jednej strony mamy du&#380;e ulepszenie w stos. do Pythona w postaci mo&#380;liwo&#347;ci wysy&#322;ania blok&#243;w kodu do metody. Z drugiej strony, nie mam w og&#243;le mo&#380;liwo&#347;ci wywo&#322;ania parametr&#243;w w dowolnej kolejno&#347;ci lub wywo&#322;ania tylko niekt&#243;rych z nich, reszt&#281; zostawiaj&#261;c warto&#347;ciom domy&#347;lnym.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;a&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;b&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;D&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{a.inspect}&lt;/span&gt; &lt;span class="expr"&gt;#{b.inspect}&lt;/span&gt; &lt;span class="expr"&gt;#{c.inspect}&lt;/span&gt; &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; 
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="comment"&gt;#{d.inspect} #{args.inspect} #{block.inspect}&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W Ruby nie ma jak wywo&#322;a&#263; &lt;code&gt;test(1,2,d=3)&lt;/code&gt;. Takie wygodne pomini&#281;cie na li&#347;cie parametru &lt;code&gt;c&lt;/code&gt; (bo ma domy&#347;ln&#261; warto&#347;&#263;) i tylko tych parametr&#243;w jakie nam pasuje mo&#380;liwe jest tylko w Pythonie. W Ruby aby zmieni&#263; parametr &lt;code&gt;d&lt;/code&gt; trzeba wywo&#322;a&#263; te&#380; parametr &lt;code&gt;c&lt;/code&gt;, czyli w tym wypadku &lt;code&gt;test(1,2,'C',3)&lt;/code&gt;. To jest bardzo niewygodne i powszechnie stosowanym trickiem na pomini&#281;cie tego ograniczenia jest przekazywanie hasza oraz opuszczanie klamer, kt&#243;re w Ruby s&#261; nieobowi&#261;zkowe. Zatem dla&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;={})&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{x.inspect}&lt;/span&gt; &lt;span class="expr"&gt;#{opts.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="ident"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 {:d=&amp;gt;4}&lt;/span&gt;
&lt;span class="ident"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;'})&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 {:d=&amp;gt;4, :c=&amp;gt;&amp;quot;C&amp;quot;}&lt;/span&gt;
&lt;span class="comment"&gt;# to samo bez nawias&#243;w i klamer:&lt;/span&gt;
&lt;span class="ident"&gt;test2&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 {:d=&amp;gt;4, :c=&amp;gt;&amp;quot;C&amp;quot;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Pozornie uzyskuje si&#281; to samo. Faktycznie jest to tylko &amp;#8220;dirty hack&amp;#8221; i odpowiednik pythonowej konstrukcji&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;**&lt;/span&gt;&lt;span class="ident"&gt;opts&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;
    &lt;span class="ident"&gt;print&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;opts&lt;/span&gt;
&lt;span class="ident"&gt;test2&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; &lt;span class="comment"&gt;# =&amp;gt; 1 {'c': 'C', 'd': 4}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Po pierwsze, tym sposobem mo&#380;na do metody przekaza&#263; dowolny hasz. Nie ma kontroli na poziomie deklaracji metody, trzeba samemu j&#261; sobie dodatkowo zaimplementowa&#263;. Np. tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;params_check&lt;/span&gt;&lt;span class="punct"&gt;(*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;keys&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;..-&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
  &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Forbiden params: &lt;span class="expr"&gt;#{forbiden.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;={})&lt;/span&gt;
  &lt;span class="ident"&gt;params_check&lt;/span&gt; &lt;span class="ident"&gt;opt&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:d&lt;/span&gt;
  &lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{x.inspect}&lt;/span&gt; &lt;span class="expr"&gt;#{opt.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;CE&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; 
&lt;span class="comment"&gt;# =&amp;gt; 1 {:c=&amp;gt;&amp;quot;CE&amp;quot;}&lt;/span&gt;

&lt;span class="ident"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; 
&lt;span class="comment"&gt;# =&amp;gt; 1 {:d=&amp;gt;4, :c=&amp;gt;&amp;quot;C&amp;quot;}&lt;/span&gt;

&lt;span class="ident"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:c=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:d=&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:foo&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;bar&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;hello&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;world&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="comment"&gt;# =&amp;gt; RuntimeError: Forbiden params: [:foo, &amp;quot;hello&amp;quot;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Po drugie, w wypadku przekazywania dodatkowego hasza, pierwszy musi posiada&#263; klamry, bo inaczej nie ma mo&#380;liwo&#347;ci rozr&#243;&#380;nienia kt&#243;re dane maj&#261; wej&#347;&#263; do pierwszego, a kt&#243;re do drugiego hasza.&lt;/p&gt;


	&lt;p&gt;Ale wracaj&#261;c do tego co odpowiedzia&#322; Matz. Przyzna&#322; wprost, &#380;e te &lt;em&gt;named parameters&lt;/em&gt; jakie mia&#322;yby wej&#347;&#263; do Ruby 2.0 s&#261; tak naprawd&#281; zwyk&#322;ym&amp;#8230; haszem! (zobacz &lt;a href="http://www.rubyist.net/~matz/slides/rc2003/mgp00027.html"&gt;ten slajd&lt;/a&gt; z wcze&#347;niejszej prezentacji Matza)&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="comment"&gt;# ...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;co naprawd&#281; znaczy tyle co&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fun&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;C&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;d&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;})&lt;/span&gt;
  &lt;span class="comment"&gt;# ...&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Taka innowacja nie jest w zasadzie &#380;adn&#261; innowacj&#261;, ale sprowadza nas z powrotem do tego co &lt;strong&gt;ju&#380; jest&lt;/strong&gt;. Je&#347;li za&#347; jedyna zmiana jaka tu ma miejsce dotyczy tylko zast&#261;pienia znak&#243;w &lt;code&gt;=&amp;gt;&lt;/code&gt; jednym znakiem dwukropka (tak jak w Pythonie nawiasem m&#243;wi&#261;c) to albo ja tu czego&#347; nie rozumiem, albo to w og&#243;le jest bez sensu.&lt;/p&gt;</description>
      <pubDate>Thu, 21 Feb 2008 01:08:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:35e54175-dbd1-4a27-828a-cb9668b84c6a</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2008/02/21/po-wideokonferencji-z-matzem</link>
      <category>ruby</category>
      <category>konferencja</category>
      <category>matz</category>
      <category>python</category>
    </item>
  </channel>
</rss>
