<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>kevinclcn</title>
    <link>https://ruby-china.org/kevinclcn</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Ruby 的变量</title>
      <description>&lt;h2 id="Global variable"&gt;Global variable&lt;/h2&gt;
&lt;p&gt;全局变量以$开头，它是全局可见的。Ruby 内建的全局变量如&lt;code&gt;$:&lt;/code&gt;和&lt;code&gt;$LOAD_PATH&lt;/code&gt;表示 require 读取文件时寻找的目录数组。&lt;/p&gt;
&lt;h2 id="Class variable"&gt;Class variable&lt;/h2&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;Example&lt;/span&gt;
  &lt;span class="vc"&gt;@@cls_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"defined in Example"&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;cls_var&lt;/span&gt;
    &lt;span class="vc"&gt;@@cls_var&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;inst_var&lt;/span&gt;
      &lt;span class="vc"&gt;@@cls_var&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cls_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "defined in Example"&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inst_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "defined in Example"&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SubExample&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;
  &lt;span class="vc"&gt;@@cls_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"modified in SubExample"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;SubExample&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cls_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "modified in SubExample"&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;SubExample&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inst_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "modified in SubExample"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;class variable 并不真正属于类，而是属于类体系结构。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="vc"&gt;@@cls_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Example&lt;/span&gt;
  &lt;span class="vc"&gt;@@cls_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vc"&gt;@@cls_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为&lt;code&gt;@@cls_var&lt;/code&gt;被定义在 Object 类上，而 Example 继承自 Object，所以 Example 也共享了这个类变量。&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;Example&lt;/span&gt;
  &lt;span class="vc"&gt;@@foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;
    &lt;span class="vc"&gt;@@foo&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;class&lt;/span&gt; &lt;span class="nc"&gt;SubExample&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;
  &lt;span class="vc"&gt;@@foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;foo&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "hello&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example.new 并不属于 SubExample，竟然也被 SubExample 的修改所影响！&lt;/p&gt;

&lt;p&gt;正因为很多地方都可以改变类变量，很难追踪是什么地方做了改变，所以不推荐使用它。&lt;/p&gt;
&lt;h2 id="Instance variable"&gt;Instance variable&lt;/h2&gt;
&lt;p&gt;在类对象上定义的变量是实例变量，以@开头，实例变量因为存在于在对象上，所以整个对象的类的继承链都可以使用。这与 Java 等静态语言不一样。&lt;/p&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;Example&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;def_inst_var&lt;/span&gt;
    &lt;span class="vi"&gt;@inst_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"I am defined in Example"&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;class&lt;/span&gt; &lt;span class="nc"&gt;SubExample&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inst_var&lt;/span&gt;
    &lt;span class="vi"&gt;@inst_var&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;sub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SubExample&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="nb"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;def_inst_var&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="nb"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inst_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "I am defined in Example"&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;Example&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inst_var&lt;/span&gt;
    &lt;span class="vi"&gt;@inst_var&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;class&lt;/span&gt; &lt;span class="nc"&gt;SubExample&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;def_inst_var&lt;/span&gt;
    &lt;span class="vi"&gt;@inst_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"I am defined by SubExample"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;sub&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;SubExample&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;

&lt;span class="nb"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;def_inst_var&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="nb"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inst_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "I am defined by SubExample"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="Class Instance variable"&gt;Class Instance variable&lt;/h2&gt;
&lt;p&gt;类本身也是一种对象，它是 Class 类的实例，在类上定义的变量，叫类实例变量。类实例变量只能被类方法访问。&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;Example&lt;/span&gt;
  &lt;span class="vi"&gt;@cls_inst_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"class instance variable"&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;cls_inst_var&lt;/span&gt;
    &lt;span class="vi"&gt;@cls_inst_var&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cls_inst_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "class instance variable"&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;Example&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;cls_inst_var&lt;/span&gt;
    &lt;span class="vi"&gt;@cls_inst_var&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;class&lt;/span&gt; &lt;span class="nc"&gt;SubExample&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;
  &lt;span class="vi"&gt;@cls_inst_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"class instance variable"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;SubExample&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cls_inst_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "class instance variable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="Local variable"&gt;Local variable&lt;/h2&gt;
&lt;p&gt;局部变量只属于当前的作用域，作用域的改变只取决于三个关键字：&lt;code&gt;class&lt;/code&gt;, &lt;code&gt;module&lt;/code&gt;和&lt;code&gt;def&lt;/code&gt;。跟 Java 等语言不同，for，if，while 等关键字并不会改变作用域。&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;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"I am OK!"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;test&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;span class="c1"&gt;# =&amp;gt; ""&lt;/span&gt;
&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; "I am OK!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>kevinclcn</author>
      <pubDate>Sat, 08 Aug 2015 21:25:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/26830</link>
      <guid>https://ruby-china.org/topics/26830</guid>
    </item>
    <item>
      <title>Ruby 的作用域和作用域门</title>
      <description>&lt;p&gt;局部变量，实例变量，self 都是绑定在对象上的名字，我们简称为绑定 (binding)。所有绑定都有一个寄居场所，我们称为作用域 (scope)。假设你是一个调试器，你时刻都处于一个作用域中，上下左右都是绑定：局部变量，实例变量，全局变量，常亮，还有当前对象 self。只有当你遇到三个关键字时，才会进入一个新作用域。&lt;/p&gt;

&lt;p&gt;这三个改变作用域的关键字，分别是&lt;code&gt;module&lt;/code&gt;,&lt;code&gt;class&lt;/code&gt;和&lt;code&gt;def&lt;/code&gt;。我们称为作用域的门 (scope gate)。&lt;/p&gt;

&lt;p&gt;在 Java 等其他语言里，一个作用域内可以看到外围作用域内的变量，但 Ruby 不同，一个作用域内只能看到当前作用域内的变量。也就是说，变量不能跨作用域查找。&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;
&lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"main scope"&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Example&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 输出undefined local variable or method `scope' for Example:Class (NameError)&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;Example&lt;/span&gt;
  &lt;span class="vi"&gt;@scope&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"class scope"&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@scope&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 输出 ""&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;任何时候都有一个当前对象，当不在任何类和方法调用中时，当前对象是 main 对象，有时称为顶级上下文 (top level context)。实例变量都会定义在当前对象上，因此在顶级上下文中定义的实例变量都会定义在 main 对象上：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="vi"&gt;@var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"main instance variable"&lt;/span&gt;

&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_variables&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 输入 [:@var]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在顶级上下文中定义的方法都会成为 Object 类的私有方法，因为 Object 是所有类的基类，所以在顶级上下文中定义的方法会成为所有类的私有方法：&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;foo&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"method defined in top level context"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Example&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_method&lt;/span&gt;
    &lt;span class="n"&gt;foo&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;my_method&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 输出 "method defined in top level context"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要打破 scope 的阻隔，需要用 ruby 内建的方法模拟这三个关键字来定义 module，class 或 method：&lt;/p&gt;

&lt;p&gt;比如&lt;code&gt;Class.new()&lt;/code&gt;和&lt;code&gt;Module.new&lt;/code&gt;方法来模拟&lt;code&gt;class&lt;/code&gt;和&lt;code&gt;module&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;my_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Success"&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;my_var&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 输出 "Sucess"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;比如&lt;code&gt;Module#define_method()&lt;/code&gt;方法来模拟&lt;code&gt;def&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;my_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Success"&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;define_method&lt;/span&gt; &lt;span class="ss"&gt;:my_method&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;my_var&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;my_method&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 输出 "Success"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>kevinclcn</author>
      <pubDate>Fri, 07 Aug 2015 23:56:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/26824</link>
      <guid>https://ruby-china.org/topics/26824</guid>
    </item>
    <item>
      <title>有什么 API document 的框架推荐</title>
      <description>&lt;p&gt;需要给一个 Java 产品生成一个在线 API 文档系统。比如类似这样：&lt;a href="https://docs.shopify.com/api/article" rel="nofollow" target="_blank"&gt;https://docs.shopify.com/api/article&lt;/a&gt;。
请问有什么 rails 的框架能做到这一点？非常感谢！&lt;/p&gt;</description>
      <author>kevinclcn</author>
      <pubDate>Wed, 17 Jun 2015 17:48:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/26078</link>
      <guid>https://ruby-china.org/topics/26078</guid>
    </item>
    <item>
      <title>请问怎样让 http 的 request 直接重定向到 https？</title>
      <description>&lt;p&gt;我用 thin 启动 rails 应用程序，命令如下：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;thin start &lt;span class="nt"&gt;--ssl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rails 确实支持 https 访问了，但是用 http 访问报 No data received 的错误。无论我怎样配置 force_ssl，还是 before_action，都没用。http request 都不能进入 before_action.&lt;/p&gt;

&lt;p&gt;Rails 的版本 4.2
Thin 的版本 1.6.3&lt;/p&gt;</description>
      <author>kevinclcn</author>
      <pubDate>Thu, 12 Feb 2015 17:16:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/24235</link>
      <guid>https://ruby-china.org/topics/24235</guid>
    </item>
    <item>
      <title>Dependency injection is not a virtue</title>
      <description>&lt;p&gt;&lt;a href="http://david.heinemeierhansson.com/2012/dependency-injection-is-not-a-virtue.html" rel="nofollow" target="_blank"&gt;http://david.heinemeierhansson.com/2012/dependency-injection-is-not-a-virtue.html&lt;/a&gt;&lt;/p&gt;</description>
      <author>kevinclcn</author>
      <pubDate>Sat, 17 May 2014 14:32:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/19324</link>
      <guid>https://ruby-china.org/topics/19324</guid>
    </item>
  </channel>
</rss>
