<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>hellomac</title>
    <link>https://ruby-china.org/hellomac</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>嵌套 each_line 仅执行一次的问题</title>
      <description>&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# cat id.txt&lt;/span&gt;
a
bb
ccc
dddd
eeeee

&lt;span class="c"&gt;# cat test.txt&lt;/span&gt;
333333
444444

&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;
&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"./id.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;file1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"./test.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each_line&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;line&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'$$$'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lineno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;
    &lt;span class="n"&gt;file1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each_line&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;line1&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'*****'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;file1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lineno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;
&lt;span class="n"&gt;file1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 输出结果:&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="s2"&gt;"*****1"&lt;/span&gt;
&lt;span class="s2"&gt;"*****2"&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$$3&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$$4&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$$5&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么第二次循环没有再次执行 file1 中的 block 内容？
此处不讨论为什么不用 readlines ,仅就上述例子。&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Mon, 07 Dec 2020 17:33:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/40655</link>
      <guid>https://ruby-china.org/topics/40655</guid>
    </item>
    <item>
      <title>错误的省略空格导致的 Ambiguous Operator 问题</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;    &lt;span class="c1"&gt;# =&amp;gt; 0 这个结果很费解,竟然不是 7&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;   &lt;span class="c1"&gt;# =&amp;gt; 7&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;             &lt;span class="c1"&gt;# =&amp;gt; 7&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;            &lt;span class="c1"&gt;# =&amp;gt; 7&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="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'parser/current'&lt;/span&gt;
&lt;span class="c1"&gt;# opt-in to most recent AST format:&lt;/span&gt;
&lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Builders&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit_lambda&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Builders&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit_procarg0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Builders&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit_encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Builders&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit_index&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CurrentRuby&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'"4".to_i +3'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CurrentRuby&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'"4".to_i + 3'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CurrentRuby&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'"4".to_i +3'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;loc&lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="no"&gt;Parser&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CurrentRuby&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'"4".to_i + 3'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;loc&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="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;:to_i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;:to_i&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;#&amp;lt;Parser::Source::Map::Send:0x00007f9ff589c348&lt;/span&gt;
 &lt;span class="vi"&gt;@begin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="vi"&gt;@dot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c1"&gt;#&amp;lt;Parser::Source::Range (string) 3...4&amp;gt;,&lt;/span&gt;
 &lt;span class="vi"&gt;@end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="vi"&gt;@expression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c1"&gt;#&amp;lt;Parser::Source::Range (string) 0...11&amp;gt;,&lt;/span&gt;
 &lt;span class="vi"&gt;@node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;:to_i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
 &lt;span class="vi"&gt;@selector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c1"&gt;#&amp;lt;Parser::Source::Range (string) 4...8&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;#&amp;lt;Parser::Source::Map::Send:0x00007f9ff78428c8&lt;/span&gt;
 &lt;span class="vi"&gt;@begin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="vi"&gt;@dot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="vi"&gt;@end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="vi"&gt;@expression&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c1"&gt;#&amp;lt;Parser::Source::Range (string) 0...12&amp;gt;,&lt;/span&gt;
 &lt;span class="vi"&gt;@node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="ss"&gt;:to_i&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
 &lt;span class="vi"&gt;@selector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c1"&gt;#&amp;lt;Parser::Source::Range (string) 9...10&amp;gt;&amp;gt;&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="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'ripper'&lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="no"&gt;Ripper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sexp&lt;/span&gt; &lt;span class="s1"&gt;'"4".to_i + 3'&lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="no"&gt;Ripper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sexp&lt;/span&gt; &lt;span class="s1"&gt;'"4".to_i +3'&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="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:program&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="ss"&gt;:binary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:string_literal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:string_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:@tstring_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]]],&lt;/span&gt;
    &lt;span class="ss"&gt;:"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:@ident&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"to_i"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]]],&lt;/span&gt;
   &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:@int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;]]]]]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:program&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="ss"&gt;:command_call&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:string_literal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:string_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:@tstring_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]]],&lt;/span&gt;
   &lt;span class="ss"&gt;:"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:@ident&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"to_i"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;
   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:args_add_block&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="ss"&gt;:@int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"+3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]]],&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;]]]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;仍然没看出为何会得零？&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Sat, 19 May 2018 19:11:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/36804</link>
      <guid>https://ruby-china.org/topics/36804</guid>
    </item>
    <item>
      <title>让人困惑的正则表达式</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"012&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;ABC"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt; &lt;span class="sr"&gt;/\AABC/&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
 &lt;span class="s2"&gt;"012&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;ABC"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match?&lt;/span&gt; &lt;span class="sr"&gt;/\AABC/&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="s1"&gt;'B'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt; &lt;span class="sr"&gt;/A*/&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;MatchData ""&amp;gt;  这里为啥返回的是空字符串,而不是nil?&lt;/span&gt;
&lt;span class="s1"&gt;'B'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match?&lt;/span&gt; &lt;span class="sr"&gt;/A*/&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#true 这里为啥返回了true,而不是false?明明没能匹配到呀~&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;感觉有点反直觉，是哪里理解错了？&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Mon, 26 Jun 2017 11:28:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/33312</link>
      <guid>https://ruby-china.org/topics/33312</guid>
    </item>
    <item>
      <title>为何 facter 中不包含 CPU 利用率等信息?</title>
      <description>&lt;p&gt;又来请教大家了，每次用老哥电脑上 RC 都感觉有状态加持!
现在希望收集各台 Linux 服务器 (CentOS,Debian，各种发行版，各种版本) 的信息 (CPU,Memory,Disk,etc),使用了 facter，可遇到了麻烦的问题。虽然其它信息很全，但缺少 CPU 利用率等一系列和 CPU 有关的软件信息。有什么解决办法吗？
问老哥他说用 snmpd 或者 nagios，还有个同事帮写的&lt;code&gt;echo $((100-$(vmstat | sed '2d' | awk '{print $15}')))&lt;/code&gt;但人家很专一，不想用 SHELL!
求更好用的 GEM???&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Sat, 02 May 2015 13:10:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/25405</link>
      <guid>https://ruby-china.org/topics/25405</guid>
    </item>
    <item>
      <title>Strong Parameters 的一些疑问</title>
      <description>&lt;p&gt;从 3.2 升级 4.0，对这个和 mass assignments 的关系不太理解.
原有：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_attributes!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:key&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:key&lt;/span&gt;&lt;span class="p"&gt;])&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;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_attributes!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并且没有启用 attr_protected?
更符合 4.0 的应该是 1 还是 2 呢？&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;###1&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_update_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="kp"&gt;private&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;  &lt;span class="nf"&gt;user_update_params&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;###2&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;除了 RESTful 的 create 和 update，还有哪些哪些常见场景容易犯错并且是 Ruby On Rails &lt;strong&gt;&lt;em&gt;没有&lt;/em&gt;&lt;/strong&gt; 错误提示的？&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Fri, 29 Nov 2013 10:27:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/15878</link>
      <guid>https://ruby-china.org/topics/15878</guid>
    </item>
    <item>
      <title>瓶颈期,求指点.</title>
      <description>&lt;p&gt;作为一个连 HTML 都不知为何物零基础的人，也就是朋友口中的"野生程序员",在一年前机缘巧合邂逅了 Ruby，从此一见钟情.
只啃了 Ruby 基础语法，就搞起了 Ruby On Rails，被虐的很惨，但也一直在坚持.
可是渐渐的，我发现我遇到了许许多多问题，比如 CRUD 写过很多，但是你问我为什么 new 方法中要建个类的实例我却解释不清。应该是我基础太薄弱的关系吧.Ruby On Rails 写了一些，但 Ruby 写的很少，元编程也只能搞懂寥寥几种，这让我很难搞懂 Ruby On Rails 的源码，始终无法深入.
也曾想过去上&lt;a href="/knwang" class="user-mention" title="@knwang"&gt;&lt;i&gt;@&lt;/i&gt;knwang&lt;/a&gt;的课程，但现有条件又不允许，不可能拿出大块时间完成课程.
零零碎碎的学，势必系统性会很差，难以提高，我该何去何从？请前辈指点。&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Thu, 05 Sep 2013 17:17:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/13903</link>
      <guid>https://ruby-china.org/topics/13903</guid>
    </item>
    <item>
      <title>调试 Ruby 项目 (已解决)</title>
      <description>&lt;p&gt;遇到困难，再次请教大家.
一个项目，执行缓慢。现在想找出瓶颈，因为有多个模块，有没有什么工具可以方便的显示单个模块的运行时间，最好能精确到行数？
看了下 pry 和 ruby-debugger, 似乎都不符合要求。是我姿势不对吗？&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Sun, 18 Aug 2013 17:43:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/13415</link>
      <guid>https://ruby-china.org/topics/13415</guid>
    </item>
    <item>
      <title>升级到 Ruby On Rails 4.0 时的问题</title>
      <description>&lt;p&gt;Hi，我又遇到问题了.
有一个小项目原来是 3.2 版本，想升级到 4.0，不过新特性完全没搞明白，卡住了，请大家指点一二。&lt;/p&gt;
&lt;h4 id="strong_parameters"&gt;strong_parameters&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Gemfile 中指定 rails 4.0 版本并且&lt;code&gt;bundle&lt;/code&gt;过了&lt;/li&gt;
&lt;li&gt;注释 config.active_record.whitelist_attributes &lt;/li&gt;
&lt;li&gt;删除 model 中的 attr_accessible&lt;/li&gt;
&lt;li&gt;新建/config/initializers/strong_parameters.rb 文件，增加&lt;code&gt;ActiveRecord::Base.send(:include,  ActiveModel::ForbiddenAttributesProtection)&lt;/code&gt;
重启 pow,&lt;code&gt;@server.update(:skip_check =&amp;gt;true)&lt;/code&gt;仍然可以正常更新。&lt;img title=":rage:" alt="😡" src="https://twemoji.ruby-china.com/2/svg/1f621.svg" class="twemoji"&gt;
童话世界里不应该是不能更新，然后我修改代码
&lt;code&gt;
@server.update(:skip_check =&amp;gt;true)
private
def skip_params
params.require(:skip_check)
end
&lt;/code&gt;
吗？??
果然童话里都是骗人的...&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>hellomac</author>
      <pubDate>Fri, 09 Aug 2013 09:59:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/13186</link>
      <guid>https://ruby-china.org/topics/13186</guid>
    </item>
    <item>
      <title>model 中处理无数据库对应关系的属性问题 [已解决]</title>
      <description>&lt;p&gt;controller:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def get_host_status_api
  @server=Server.find_by_openid(session[:openid])
  @hosts = @server.hosts
  @hosts.each  do |host| 
      if  @server.skip_check
        host[running]='unknown'
      else
        get_host_status(host.ip).each_pair {|name, val| host[name]=val}
      end
  end
  respond_to do |format|
  format.json { render :json =&amp;gt; @hosts }
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;get_host_status 返回第三方接口的数据，形如{"cpu"=&amp;gt;"2%","mem"=&amp;gt;"5%"}
model:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Host &amp;lt; ActiveRecord::Base
  attr_accessible :ip, :nick, :server_id
  validates :ip,
            :length =&amp;gt; {:minimum=&amp;gt;7,:maximum=&amp;gt;15},
            :uniqueness =&amp;gt; true,
            :format =&amp;gt; {:with=&amp;gt; /\d+\.\d+\.\d+\.\d+/ }
  belongs_to :server
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看起来返回是正确的：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[{"cpu":"0.2%","created_at":"2013-07-05T17:51:53+08:00","id":126,"ip":"192.168.1.101","mem":"25%","nick":"debian\n","running":"idle","server_id":5,"updated_at":"2013-07-05T17:51:53+08:00","uptime":"1 days, 2:21","version":"20130612"},{"created_at":"2013-07-12T10:57:17+08:00","id":127,"ip":"8.8.8.8","nick":null,"running":"unknown","server_id":5,"updated_at":"2013-07-12T10:57:17+08:00"}]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但日志报错：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DEPRECATION WARNING: You're trying to create an attribute `running'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc. (called from block (3 levels) in get_host_status_api at /Users/hellomac/Desktop/power/app/controllers/servers_controller.rb:132)
DEPRECATION WARNING: You're trying to create an attribute `version'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc. (called from block (3 levels) in get_host_status_api at /Users/hellomac/Desktop/power/app/controllers/servers_controller.rb:132)
DEPRECATION WARNING: You're trying to create an attribute `cpu'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc. (called from block (3 levels) in get_host_status_api at /Users/hellomac/Desktop/power/app/controllers/servers_controller.rb:132)
DEPRECATION WARNING: You're trying to create an attribute `mem'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc. (called from block (3 levels) in get_host_status_api at /Users/hellomac/Desktop/power/app/controllers/servers_controller.rb:132)
DEPRECATION WARNING: You're trying to create an attribute `uptime'. Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc. (called from block (3 levels) in get_host_status_api at /Users/hellomac/Desktop/power/app/controllers/servers_controller.rb:132)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按照错误信息我尝试修改
controller:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  def get_host_status_api
    @server=Server.find_by_openid(session[:openid])
    @hosts = @server.hosts
    @hosts.each  do |host| 
        if  @server.skip_check
==&amp;gt;        host.running='unknown'
        else
==&amp;gt;       get_host_status(host.ip).each_pair {|name, val| host.send("#{name}=",val)}
        end
    end
    respond_to do |format|
    format.json { render :json =&amp;gt; @hosts }
    end
  end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;model:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Host &amp;lt; ActiveRecord::Base
  attr_accessible :ip, :nick, :server_id
==&amp;gt;  attr_accessor :running, :version, :cpu, :mem, :uptime
  validates :ip,
            :length =&amp;gt; {:minimum=&amp;gt;7,:maximum=&amp;gt;15},
            :uniqueness =&amp;gt; true,
            :format =&amp;gt; {:with=&amp;gt; /\d+\.\d+\.\d+\.\d+/ }
  belongs_to :server
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;报错信息是没了，但返回的结果为：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[{"created_at":"2013-07-05T17:51:53+08:00","id":126,"ip":"192.168.1.101","nick":"debian\n","server_id":5,"updated_at":"2013-07-05T17:51:53+08:00"},{"created_at":"2013-07-12T10:57:17+08:00","id":127,"ip":"8.8.8.8","nick":null,"server_id":5,"updated_at":"2013-07-12T10:57:17+08:00"}]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种情况到底应该怎么处理呢？??&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Tue, 16 Jul 2013 19:46:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/12546</link>
      <guid>https://ruby-china.org/topics/12546</guid>
    </item>
    <item>
      <title>一组命令如何转入后台执行?(仍有疑问)</title>
      <description>&lt;p&gt;预期的目的是:
下载一个 shell 文件并在后台执行，以避免长时间等待.
我的做法如下:
&lt;code&gt;wget -O - http://a.com/b.sh|bash&lt;/code&gt;
不过这里并未转入后台执行，我只知道单条命令在命令末端追加 &amp;amp; 符号即可。可看起来这并不适用于 pipe.
请教大家正确的写法是？&lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Fri, 25 Jan 2013 14:26:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/8359</link>
      <guid>https://ruby-china.org/topics/8359</guid>
    </item>
    <item>
      <title>如何删除一个发布在 RubyGem.org 的项目?</title>
      <description>&lt;p&gt;之前为了学习，build 了一个 gem 并发布到 RubyGem 上了，想注销项目的时候囧了，翻遍了 dashboard 和 guides，没找到...
求帮助  &lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Tue, 29 May 2012 10:43:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/3542</link>
      <guid>https://ruby-china.org/topics/3542</guid>
    </item>
    <item>
      <title>求助各位使用 Mac 的前辈们</title>
      <description>&lt;p&gt;看各位前辈力荐 Mac，兴冲冲抱了一台 mini 回来，刚开始觉得它能保留工作状态实在是太赞了。可紧接着，遇到许许多多问题，请各位前辈传授传授经验.
                          Mac           Windows         缺陷
输入法              QQ 拼音         QQ 拼音       词库无法同步导入
文件搜索           finder            everything     不够强大、快速
快速启动           Quicksliver     AltRun          这是最纠结的，AltRun 是神器&lt;/p&gt;

&lt;p&gt;以上这几种可否有更好的替代方案？ &lt;/p&gt;</description>
      <author>hellomac</author>
      <pubDate>Thu, 02 Feb 2012 11:07:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/1008</link>
      <guid>https://ruby-china.org/topics/1008</guid>
    </item>
  </channel>
</rss>
