<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ruomu (yao)</title>
    <link>https://ruby-china.org/ruomu</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>pry 在 gitbash 中无法运行？</title>
      <description>&lt;p&gt;在 gitbash 中 打开 pry，输入任何 Ruby 语句都看不到运行结果，怎么解决。&lt;/p&gt;</description>
      <author>ruomu</author>
      <pubDate>Tue, 08 May 2018 23:56:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/36724</link>
      <guid>https://ruby-china.org/topics/36724</guid>
    </item>
    <item>
      <title>rvm list 能够列出 系统中以前安装的 Ruby 版本么</title>
      <description>&lt;p&gt;系统 Ubuntu，自带 ruby 2.3.1, 安装完 rvm 后，使用 rvm install 2.5.0 --disable-binary。&lt;/p&gt;

&lt;p&gt;使用 rvm list 只能显示 2.5.0，无法显示 2.3.1。怎么解决这个问题&lt;/p&gt;</description>
      <author>ruomu</author>
      <pubDate>Sat, 10 Mar 2018 19:39:48 +0800</pubDate>
      <link>https://ruby-china.org/topics/35209</link>
      <guid>https://ruby-china.org/topics/35209</guid>
    </item>
    <item>
      <title>学习 Ruby 正则的简单记录</title>
      <description>&lt;h2 id="Ruby正则知识记录"&gt;Ruby 正则知识记录&lt;/h2&gt;
&lt;p&gt;把自己关于 ruby 正则相关的知识做个小结。第一次发帖可能比较乱。&lt;/p&gt;
&lt;h2 id="正则表达式的分组捕获"&gt;正则表达式的分组捕获&lt;/h2&gt;
&lt;p&gt;基于正则匹配的全局变量如 $~, $1,$2,$3... 是线程相关的本地&lt;del&gt;全局&lt;/del&gt;变量。也就是说每个线程中的这些变量都是不一样的，$n在不同线程中不会冲突。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="sr"&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="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"abc"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Thread&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="sr"&gt;/(def)/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"def"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"$1 in the thread: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vg"&gt;$1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; $1 in the thread: def&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"$1 outside thread: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vg"&gt;$1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt; $1 outside thread: abc&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 () 圆括号指定捕获 (capture)。  &lt;/p&gt;
&lt;h2 id="具名捕获 (?&lt;name&gt;)"&gt;具名捕获 (?&amp;lt;name&amp;gt;)&lt;/h2&gt;
&lt;p&gt;Ruby 中的正则可以允许我们给子表达式命名，以便后面使用。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;re&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/(?&amp;lt;first&amp;gt;\w+)\s+((?&amp;lt;middle&amp;gt;\w\.)\s+)?(?&amp;lt;last&amp;gt;\w+)/&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"David A. Black"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;  #&amp;lt;MatchData "David A. Black" first:"David" middle:"A." last:"Black"&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:first&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt; "David"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;以上来自 The Well-Grounded Rubyist&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="正则表达式的断言  lookaround"&gt;正则表达式的断言  lookaround&lt;/h2&gt;&lt;h3 id="1. 先行断言(正向查找) LookAhead Assertions --- （？= reg） 或 （？！ reg)"&gt;1. 先行断言 (正向查找) LookAhead Assertions --- （？= reg）或（？！reg)&lt;/h3&gt;
&lt;p&gt;完整的描述是：零宽度，正向的先行断言
匹配以某种模式结尾的字符（但不包含匹配文本中的字符)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;指定下一个出现的字符但不匹配它
零宽度意味着在字符串中，它不会消耗任何字符。表示 r 参与正向查找的字符串 依旧可以被匹配
正向的含义是确保 reg 匹配的字符 (串) 会出现。负向先行 (？！reg) 表示 reg 匹配的字符 (串) 不会出现&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"123 456. 789"&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/\d+(?=\.)/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; 456&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;解释零宽度&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"123 456. 789"&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/\d+(?=\.)\./&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; 456.    ---&amp;gt; '.' 虽然参与了先行断言，但是被没有被消耗，依旧可以被匹配&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2. 回顾断言（反向查找） LookBehind Assertions （？&lt;= reg) 或 （？&lt;! reg)"&gt;2. 回顾断言（反向查找）LookBehind Assertions（？&amp;lt;= reg) 或（？&amp;lt;! reg)&lt;/h3&gt;
&lt;p&gt;确保前面的字符匹配 reg，但不包含匹配 reg 文本中的字符&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(?&amp;lt;=re) Positive lookbehind assertion 正向回顾断言&lt;/li&gt;
&lt;li&gt;(?&amp;lt;!reg) Negative loolbehind assertion 负向回顾断言&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;re&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/(?&amp;lt;=David\s)BLACK/&lt;/span&gt;
&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'David BLACK'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;MatchData "BLACK"&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;# Negative lookbehind assertion&lt;/span&gt;
&lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/(?&amp;lt;!David\s)BLACK/&lt;/span&gt;
&lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Jim BLACK'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt; #&amp;lt;MatchData "BLACK"&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;小技巧&lt;/strong&gt;  我们可以把&lt;strong&gt;&amp;lt;&lt;/strong&gt; 看成往字符左边走。从而区分正向和反向查找&lt;/p&gt;
&lt;h3 id="3. 条件匹配--满足条件则匹配，不满足匹配其它的，类似三目运算符"&gt;3. 条件匹配--满足条件则匹配，不满足匹配其它的，类似三目运算符&lt;/h3&gt;
&lt;p&gt;(?if then|else)
在 Ruby 中的形式是/(?(A)X|Y)/  -- 满足条件 A 则匹配 X，否则匹配 Y&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# if A is true, then match the expression X, else match Y&lt;/span&gt;
&lt;span class="sr"&gt;/(?(A)X|Y)/&lt;/span&gt;

&lt;span class="c1"&gt;# if A is false, the Y&lt;/span&gt;
&lt;span class="sr"&gt;/(?(A)|Y)/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;两种最常用的的条件方式：A 形如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 为具名捕获 或者 数字检索捕获&lt;br&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 分组1是否被捕获&lt;/span&gt;
&lt;span class="sr"&gt;/(?(1)foo|bar)/&lt;/span&gt;

&lt;span class="c1"&gt;# 名称为 "mygroup" 的是否被捕获&lt;/span&gt;
&lt;span class="sr"&gt;/(?(&amp;lt;mygroup&amp;gt;)foo|bar)/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;example&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;如果一个号码以1开头，则必须要有一个三个数字的区域号
否则区域号是可选的(optional)
如下：800 为区域号
1-800-555-1212 # Valid
800-555-1212  # Valid
555-1212 # Valid

1-555-1212 # Invalid 缺少区域号

&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;re&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^(1-)?(?(1)\d{3}-|(\d{3})?)\d{3}-\d{4}/&lt;/span&gt;
&lt;span class="s2"&gt;"1-800-555-1212"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; #&amp;lt;MatchData "1-800-555-1212" 1:"1-" 2:nil&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;"800-555-1212"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; #&amp;lt;MatchData "800-555-1212" 1:nil 2:"800-"&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;"555-1212"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; #&amp;lt;MatchData "555-1212" 1:nil 2:nil&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;"1-555-1212"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Limitations 不足之处&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;使用 group-based conditionals(分组捕获作为 if 的条件匹配) 的不足在于，条件匹配不是零宽度字符匹配 (即会消耗字符)
。消耗的字符不能再被使用。  &lt;/p&gt;

&lt;p&gt;来个栗子  &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"100USD"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/(USD)(?(1)\d+)/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;在 Perl 和其他语言里，我们可以在 if 的位置上添加 look-around statement.
但是 Ruby 语言不支持。但可以用些技巧来实现&lt;/p&gt;

&lt;p&gt;在 look-around 中设置一个 group，此时的 group 不会消耗字符   &lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"100USD"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/(?=.*(USD))(?(1)\d+)/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; #&amp;lt;MatchData "100" 1:"USD"&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;#  (?=.*(USD))  其中的 .*(USD)很重要。 先行断言 整个 "100USD", 即匹配的位置在0位置&lt;/span&gt;
&lt;span class="c1"&gt;#  (USD) 在先行断言中设置分组，不会消耗字符&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上难免有错误的地方，还请大牛们斧正。&lt;/p&gt;</description>
      <author>ruomu</author>
      <pubDate>Wed, 19 Apr 2017 14:24:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/32821</link>
      <guid>https://ruby-china.org/topics/32821</guid>
    </item>
    <item>
      <title>新手找份 Ruby 的工作好难哦。。。。</title>
      <description>&lt;p&gt;非计算机专业，转行学习 Ruby 和 rails 后，发现想找份相关的职位好难哦。广州哪里要搬砖的。。。。&lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; &lt;/p&gt;</description>
      <author>ruomu</author>
      <pubDate>Thu, 02 Mar 2017 15:26:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/32422</link>
      <guid>https://ruby-china.org/topics/32422</guid>
    </item>
    <item>
      <title>Webpack Alias 问题求助</title>
      <description>&lt;p&gt;新手一枚，在 学习 ReactJs 中，使用 webpack 配置 resolve.alias 出现一些问题。
我的 webpack 配置如下：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./public/app.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./public/bundle.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// root: __dirname,&lt;/span&gt;
        &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;Greeter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/components/Greeter.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;GreeterMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/components/GreeterMessage.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;GreeterForm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/components/Greeter.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;loaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;babel-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;es2015&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;jsx&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;node_modules|bower_components&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;项目文件目录如下：  &lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;app&lt;/span&gt;     
  &lt;span class="s"&gt;/public&lt;/span&gt;   
   &lt;span class="s"&gt;app.jsx&lt;/span&gt;        
   &lt;span class="s"&gt;/components&lt;/span&gt;    
      &lt;span class="s"&gt;GreeterMessage.jsx&lt;/span&gt; 
      &lt;span class="s"&gt;GreeterForm.jsx&lt;/span&gt;    
      &lt;span class="s"&gt;Greeter.jsx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么我在 app.jsx 中 使用&lt;code&gt;import Greeter from 'Greeter';&lt;/code&gt;, 在 Greeter.jsx 中使用 &lt;code&gt;import GreeterMessage from 'GreeterMessage'; import GreeterForm from 'GreeterForm';&lt;/code&gt;
会出现引用问题呢。出现
&lt;code&gt;
 bundle.js:303 Uncaught Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in. Check the render method of&lt;/code&gt;Greeter&lt;code&gt;.(…)
&lt;/code&gt;  &lt;/p&gt;

&lt;p&gt;但直接使用 require（‘./components/Greeter’）这种方式程序能够正确运行。&lt;/p&gt;</description>
      <author>ruomu</author>
      <pubDate>Sat, 11 Feb 2017 12:19:04 +0800</pubDate>
      <link>https://ruby-china.org/topics/32291</link>
      <guid>https://ruby-china.org/topics/32291</guid>
    </item>
    <item>
      <title>Ruby China 登入问题</title>
      <description>&lt;p&gt;为什么我在 chrome 上登入了 Ruby China，但当我在 Firefox 上登入时，却报错
&lt;img src="https://l.ruby-china.com/photo/2016/127b8ae60f584c883ddc9795c949242d.png!large" title="" alt=""&gt;。
这是为什么？&lt;/p&gt;</description>
      <author>ruomu</author>
      <pubDate>Sat, 12 Nov 2016 18:41:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/31582</link>
      <guid>https://ruby-china.org/topics/31582</guid>
    </item>
    <item>
      <title>自学 Rails 新手，如何能够找到一份工作呢？</title>
      <description>&lt;p&gt;小白，转行自学 rails，貌似找工作都需要有工作经验，那请问各位大大，这种新手如何能找到一份工作呢？&lt;/p&gt;</description>
      <author>ruomu</author>
      <pubDate>Thu, 10 Nov 2016 12:35:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/31566</link>
      <guid>https://ruby-china.org/topics/31566</guid>
    </item>
    <item>
      <title>如何在 Ubuntu 中同时安装多个 Rails 版本？</title>
      <description>&lt;p&gt;新手学过 rails4，现在想学习 rails5，请问如何在 Ubuntu 中同时安装 rails4，和 rails5？谢谢各位了。&lt;/p&gt;</description>
      <author>ruomu</author>
      <pubDate>Thu, 10 Nov 2016 01:05:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/31564</link>
      <guid>https://ruby-china.org/topics/31564</guid>
    </item>
  </channel>
</rss>
