<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>engin123456789</title>
    <link>https://ruby-china.org/engin123456789</link>
    <description>海贼王に、俺はなる！</description>
    <language>en-us</language>
    <item>
      <title>元编程中验证的问题</title>
      <description>&lt;p&gt;《ruby 元编程》中有这样一个例子：
写一个类似类宏 attr_accessor 的用来检验参数是否合法的方法。
但是使用中似乎有一中情况会被绕过：&lt;/p&gt;

&lt;p&gt;模块代码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;CheckAttr&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;included&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;
        &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ClassModule&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ClassModule&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;attr_checked&lt;/span&gt; &lt;span class="kp"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;validate_block&lt;/span&gt;
            &lt;span class="n"&gt;define_method&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="kp"&gt;attr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;="&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="s1"&gt;'invalidate attribuate'&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;validate_block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
                &lt;span class="nb"&gt;instance_variable_set&lt;/span&gt; &lt;span class="s2"&gt;"@&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="kp"&gt;attr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt;

            &lt;span class="n"&gt;define_method&lt;/span&gt; &lt;span class="kp"&gt;attr&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
                &lt;span class="nb"&gt;instance_variable_get&lt;/span&gt; &lt;span class="s2"&gt;"@&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="kp"&gt;attr&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用代码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;
    &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;CheckAttr&lt;/span&gt;
    &lt;span class="n"&gt;attr_checked&lt;/span&gt; &lt;span class="ss"&gt;:age&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;
        &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
        &lt;span class="vi"&gt;@age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种情况下如果直接使用&lt;code&gt;person = Person.new 'shiyj',16&lt;/code&gt;就会绕过这种检验，而只有使用&lt;code&gt;person.age = 16&lt;/code&gt;才会执行。&lt;/p&gt;

&lt;p&gt;那么有没有一种更好的实现，使这个·attr_checked·能够像·attr_accessor·一样既定义&lt;code&gt;@age&lt;/code&gt;,又可以在&lt;code&gt;@age=&lt;/code&gt;时来控制？？&lt;/p&gt;</description>
      <author>engin123456789</author>
      <pubDate>Thu, 23 Jan 2014 15:40:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/16949</link>
      <guid>https://ruby-china.org/topics/16949</guid>
    </item>
    <item>
      <title>heroku 的 H12 Timeout 错误.如何将时间设置超过 30 秒?</title>
      <description>&lt;p&gt;做一个从学校图书馆抓取数据的程序，用 open-uri 来打开网页，再抓取内容，但是这个时间远超出 30s.&lt;/p&gt;

&lt;p&gt;用 sinatra 做服务器，是不是有哪种方法可以让它用 worker 在后台读，读完之后再返回给客户端。而不是根据 timeout 就停止请求？&lt;/p&gt;

&lt;p&gt;再或者直接修改这个 timeout 值？ &lt;/p&gt;</description>
      <author>engin123456789</author>
      <pubDate>Thu, 05 Jan 2012 16:10:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/742</link>
      <guid>https://ruby-china.org/topics/742</guid>
    </item>
  </channel>
</rss>
