<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[阿当个人空间]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[打造高品质的前端代码]]></description>
<link>http://hi.baidu.com/cly84920</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[rails学习笔记(2)]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/dcbff52d3fb3cd3e359bf7e8.html]]></link>
        <description><![CDATA[
		
		<p>1）rails自动生成的目录中，lib目录和vendor目录分别用于存放你自己编写的组件或者第三方提供的组件，它们需要被你的应用程序用到，但又不专属于你的项目。log目录下存放的是日志文件，日志文件会针对开发环境，测试环境和生产环境分别记录。config目录是用来设置rails的配置的，其中包括用于配置服务器链接的yml文件和运行时环境配置文件等。运行时环境配置可以针对三个环境分别进行设置，公共的部分在config根目录下的environment.rb文件中设置，而针对某个环境的设置，则在config/environments/目录下的development.rb、production.rb、test.rb中进行个性设置。</p>
<p>2）在启动web服务器时，可以通过加上-e选项，指定启动时选用哪个环境</p>
<p>==================================</p>
<p>ruby script/server -e development | test | production</p>
<p>==================================</p>
<p>3）rails里强调&ldquo;惯例重用配置&rdquo;，从数据库中的表，到控制器，到模型，再到视图，命名是有关联的！文件的存放路径也是有关联的。我们在命名和存放文件时需要遵守这种惯例。一旦我们遵守了这种惯例这四者之间的映射都是rails自动替我们去完成的，这也是rails为何能&ldquo;敏捷&rdquo;的重要原因。</p>
<p>4）在编写普通ruby代码时，如果我们想要使用另一个文件中的类和模块，需要先require它们，但在rails中编程，因为rails有命名约定，所以可以不用require它们就直接使用，rails会根据命名约定（也包括路径约定），去自动加载该文件！不过，也有例外的时候，如果被引用的类要在session中保存，自动加载就会失效，但即便如此，我们也仍然不需要require，我们只需要在类里加上一句 model :类文件名（注，小字加下划线分隔）。</p>
<p>==================================</p>
<p>class StroeController &lt; ApplicationController</p>
<p>  model :line_item&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #rails会去加载line_item.rb文件，其中包含LineItem类。</p>
<p>==================================</p>
<p>5）控制器的路径默认是存放在app/controllers根目录下的，但如果我们需要在根目录下再组织一下控制器的路径，那么可以将控制器的声明位于ruby模块之下。例如，我们要将book_controller.rb文件放置于admin目录下，也就是app/controllers/admin/book_controller.rb，那么，我们就应该这样声明：</p>
<p>==================================</p>
<p>class Admin::BookController &lt; ApplicationController</p>
<p>..</p>
<p>end</p>
<p>==================================</p>
<p>幸运的是，rails的生成器很智能，你可以直接使用</p>
<p>==================================</p>
<p>ruby script/generate controller Admin::Book action1 action2</p>
<p>==================================</p>
<p>来生成你需要的路径。</p>
<p>6） rails用ActiveRecord来处理对象-关系映射（ORM）。数据库中的一张表对应着模型中的一个类，表名是小写的，多单词用下划线分隔，而且是复数形式。对应的类名是单词首字母大写来进行分隔的，而且是单数形式。表中的字段直接映射成类的属性，除此之外，我们还可以给类再另外添加一些属性。表名和类名是通过命名惯例去自动对应的，（rails对ruby的字符串类进行了扩展，让它直接支持单复数之间的转变，例如 puts &quot;cat&quot;.pluralize&nbsp;&nbsp;&nbsp;  #=&gt;cats&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  puts &quot;cats&quot;.singularize  #=&gt;cat），仅管pluralize和singularize方法已经很智能了，能处理child和children这样的单复数转换，但它仍然还是有缺陷，例如sheep会对应到sheeps。我们可以在模型类中，cefpset_table_name去显示地指明对应的表，而不使用缺省的惯例。</p>
<p>==================================</p>
<p>class Sheep &lt; ActiveRecord::Base</p>
<p>&nbsp;&nbsp;&nbsp;  set_table_name &quot;sheep&quot;</p>
<p>end</p>
<p>==================================</p>
<p>7）ActiveRecord从表中取出值，变成类的对象时，会自动将数据库中的类型转换成ruby支持类型，例如数据库字段是timestamp类型的，就会返回Time对象。如果你希望得到一个属性的原始值，可以在属性名称后面加上_before_type_cast。</p>
<p>==================================</p>
<p>account.balance_before_type_cast</p>
<p>==================================</p>
<p>如果在模型内部,可以使用私有方法read_attribute()和write_attribute()。</p>
<p>8）布尔型的数据在转换的时候会有些麻烦，有些数据库是不支持布尔型的，所以我们在工作中，可以使用0,1这样的数字来代表布尔值的真假，而ruby中只有false和nil为假，0其实是为真的。所以在数据库映射到类时，我们要判断某个属性的真假时，记得要加一个?号，这个是rails为解决布尔型问题而设置的。</p>
<p>==================================</p>
<p># 错误写法</p>
<p>if user.superuser</p>
<p>&nbsp;&nbsp;&nbsp;  doSomeThing</p>
<p>end</p>
<p> </p>
<p># 正确写法</p>
<p>if user.superuser?</p>
<p>&nbsp;&nbsp;&nbsp;  doSomeThing</p>
<p>end</p>
<p>==================================</p>
<p>9） 在编程时，可以某个属性对应的是一个对象，而不是一个简单类型的数据。在类和表的映射的时候，这种复杂类型的属性也是可以直接保存到表中的一个字段的，这个字段必须是text类型的，属性会以字符串的形式存进数据据。而从数据库中映射到类时，需要在类中加以声明，某个字段是个对象，不是普通字符串。声明的方法是serialize()。复杂类型包括对象，数组，hash等等。</p>
<p>==================================</p>
<p>class Purchase &lt; ActiveRecord::Base</p>
<p>&nbsp;&nbsp;  serialize :last_five</p>
<p>&nbsp;&nbsp;&nbsp; ...</p>
<p>end</p>
<p>==================================</p> <a href="http://hi.baidu.com/cly84920/blog/item/dcbff52d3fb3cd3e359bf7e8.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Ruby%20On%20Rails">Ruby On Rails</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/dcbff52d3fb3cd3e359bf7e8.html#comment">查看评论</a>]]></description>
        <pubDate>2009-12-04  11:29</pubDate>
        <category><![CDATA[Ruby On Rails]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/dcbff52d3fb3cd3e359bf7e8.html</guid>
</item>

<item>
        <title><![CDATA[一个不错的rails2.0教程]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/2808201f0b9eceffe1fe0bcd.html]]></link>
        <description><![CDATA[
		
		<p>买了几本rails的书，版本都是1.0或者1.2，都是几年前的书，现在新版的rails已经是2.0了，书上的例子没法演示 T_T，要么学好英语，买影印版的最新版去，要去只能就着1.0的中文参考书和网上几乎少到没有教程去摸索。</p>
<p>推荐一篇rails2.0的教程，虽然不是零基础的，好歹也是2.0的教程，将就着看吧。</p>
<p><a href="http://www.akitaonrails.com/2007/12/12/rolling-with-rails-2-0-the-first-full-tutorial">http://www.akitaonrails.com/2007/12/12/rolling-with-rails-2-0-the-first-full-tutorial</a></p>
<p> </p>
<p>另外，非常值得一提的是，ruby中文社区真是垃圾，输入验证码就没验证成功过！看了半天贴子，基本没有有用信息。rails中文社区更过，啥有用的内容也没看到。难怪ror在中国这么难推广，叫人怎么学？书是过时的，社区又跟不上！比较而言，就csdn的ror版块还有些人在问些有用的问题，如果想学的话，推荐去csdn的ror版块。</p>
<p>下面再推荐些英文的网站，硬着头皮看吧：</p>
<p><a href="http://guides.rubyonrails.org/">http://guides.rubyonrails.org/</a></p> <a href="http://hi.baidu.com/cly84920/blog/item/2808201f0b9eceffe1fe0bcd.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Ruby%20On%20Rails">Ruby On Rails</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/2808201f0b9eceffe1fe0bcd.html#comment">查看评论</a>]]></description>
        <pubDate>2009-12-03  16:54</pubDate>
        <category><![CDATA[Ruby On Rails]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/2808201f0b9eceffe1fe0bcd.html</guid>
</item>

<item>
        <title><![CDATA[rails学习笔记(1)]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/d9dedcd79a164ad7a044df43.html]]></link>
        <description><![CDATA[
		
		<p>1) 在windows系统上安装rails很简单，首先需要安装ruby，完整安装，然后先在命令行输入gem --version，如果显示出版本号，就可以直接使用RubyGems来安装rails。直接在命令行输入 gem install rails --include-dependencies就可以自动完成安装了。需要注意的是，在windows系统上配置ror环境，还会出现一些奇怪的问题，具体安装过程推荐一篇博客：<a href="http://hi.baidu.com/haoweiren1234/blog/item/1d84b53875b8ea2cb9998f79.html">http://hi.baidu.com/haoweiren1234/blog/item/1d84b53875b8ea2cb9998f79.html</a>，博主讲解得非常清楚。</p>
<p>2) ruby和其它服务器端语言一样，可以运行动态脚本，格式是&lt;% %&gt;。如果想输出显示，可以使用&lt;%= %&gt;。ruby的服务器使用的是WEBrick，不是appache，不是IIS，不是tomcat哦。</p>
<p>3）用rails新建一个项目很简单，在命令行输入 rails xxx，xxx就是项目的根目录文件夹名。然后rails会为你自动创建好目录结构，并提供好部分代码。rails提倡的敏捷开发，很大意义上依靠于这种带有&ldquo;强制性&rdquo;的自动操作。rails会为你建好目录，搭好框架，我们需要做的，只是填充框架里的内容。不用置疑rails自动搭建的框架是否优秀，是否弹性十足，是否可维护性良好。rails的敏捷开发目标，目的就是为了搭一个最优势的框架。</p>
<p>4）新建项目之后，在命令行输入 ruby script/server，运行rails自动为我们生成的代码中的server脚本，就可以启动WEBrick服务器了。</p> <a href="http://hi.baidu.com/cly84920/blog/item/d9dedcd79a164ad7a044df43.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Ruby%20On%20Rails">Ruby On Rails</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/d9dedcd79a164ad7a044df43.html#comment">查看评论</a>]]></description>
        <pubDate>2009-12-01  11:07</pubDate>
        <category><![CDATA[Ruby On Rails]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/d9dedcd79a164ad7a044df43.html</guid>
</item>

<item>
        <title><![CDATA[ruby学习笔记(6)]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/8f1c528bfa547bd9fc1f1058.html]]></link>
        <description><![CDATA[
		
		<p>String 类</p>
<p>1）单引号和双引号。 单引号不会对里面的字符进行转义，类似于&quot;\n&rdquo;这样的转义会直接输出，也不能包含表达式。双引号则可以包含转议字符，也能包含表达式，表达式的格式为 #{xxxx}。需要注意的是，如果单引号里的字符串也包含单引号，还是要用&ldquo;\'&rdquo;进行转义的，这个转义是支持的。</p>
<p>=======================</p>
<p>a = &quot;abc&quot;</p>
<p>b = &quot;1\n2\n3\n#{a}&quot;</p>
<p>c = '1\n2\n3\n#{a}'</p>
<p>puts b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 1&nbsp;&nbsp;  2&nbsp;&nbsp;  3&nbsp;&nbsp;  abc</p>
<p>puts c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;&nbsp;&nbsp;&nbsp;  1\n2\n3\n#{abc}</p>
<p>=======================</p>
<p>2） 新建字符串。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;1&gt; 直接使用 &quot;&quot;和''生成字符串。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;2&gt; 使用String.new()生成字符串。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;3&gt; 使用%Q和%q。 如果字符串中包括&quot;&quot;或''时，不想使用\&quot;和\'频繁转义，可以使用%Q和%q来生成字符串。其中%Q相当于&quot;，%q相当于'。和%w一样，分界符可以用&lt;&gt; @@之类的。</p>
<p>=======================</p>
<p>%Q(1\n2\n3\n#{a}&quot;5678&quot;'9012')</p>
<p>%q&lt;1\n2\n3\n#{a}'5678'&quot;9012&quot;&gt;</p>
<p>=======================</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;4&gt; 如果是多行文本，可以使用&lt;&lt;&quot;xxx&quot; 或 &lt;&lt;-&quot;xxx&quot;来实现多行。一般xxx多使用EOB或EOF，表示end of black和end of file。注意，如果是xxx可以用单引号或双引号引起来，分别代表单引和双引，也可以不带引号，默认代表双引。注意&lt;&lt;和xxx之间要连在一起，不要有空格。</p>
<p>======================</p>
<p>a = 123</p>
<p>s = &lt;&lt;-&quot;EOB&rdquo;</p>
<p>i : abc</p>
<p>j : #{a}</p>
<p>adang is me</p>
<p>EOB</p>
<p>print s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; i : abc&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  j : 123</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  adang is me</p>
<p>======================</p>
<p>3） 字符串的长度。 字符串的长度可以用str.size或者str.length来获得。如果是英文字符，那么可以正常返回字符个数，但如果是非英文字符，比如说是中文字符，size返回的值就不正确了。因为ruby中返回的是字节数，不是字符数，这点和js不同。如果是中文，跟编码格式有关，如果是utf-8编码，那么一个中文占用三个字节，如果是ANSI编码，那么一个中文占用两个字节。为了解决这个问题，可以借助于正则表达式，换个思路获得字符串的字符长度。例如utf-8编码的，用str.split(//u).length，ANSI编码的，用str.split(//e).length。</p>
<p>=======================</p>
<p>utf-8编码</p>
<p>a = &quot;我是个中文abc&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>puts a.size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (5X3+3 = 18)</p>
<p>puts a.split(//u).length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (5+3 = 8)</p>
<p>ANSI编码</p>
<p>a = &quot;我是个中文abc&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>puts a.size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (5X2+3 = 13)</p>
<p>puts a.split(//e).length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (5+3 = 8)</p>
<p>=======================</p>
<p>4） empty?&nbsp;&nbsp;&nbsp;  ruby中字符串提供了empty?方法判断是否为空。注意，如果有空格或者tab，都不算为空的。</p>
<p>=======================</p>
<p>a = &quot;&quot;</p>
<p>p a.empty?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; true</p>
<p>a = &quot; &quot;</p>
<p>p a.empty?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; false</p>
<p>=======================</p>
<p>5） split和unpack。 ruby中分割字符串有两种方法，一种是split，按特定字符分隔，另一种是unpack，按&ldquo;字节&rdquo;数分隔。unpack的参数格式是aXaX,&ldquo;X&rdquo;表示要截取的字节数。需要注意提，如果X+X的字符数不够整个字符串长度的话，字符串后面的字符就没了，如果超过总长度的话，会按最大数来截取，如果不确定最后一节的长度，可以使用a*来截取至结尾处的部分。</p>
<p>=======================</p>
<p>a = &quot;1:2:3:4:5:6&quot;</p>
<p>p a.split(&quot;:&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;4&quot;,&quot;5&quot;,&quot;6&quot;]</p>
<p>p a.unpack(&quot;a2a3&quot;)&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;1:&quot;,&quot;2:3&quot;]</p>
<p>p a.unpack(&quot;a2a30&quot;) #=&gt;[&quot;1:&quot;,&quot;2:3:4:5:6&quot;]</p>
<p>p a.unpack(&quot;a2a3a*&quot;) #=&gt;[&quot;1:&quot;,&quot;2:3&quot;,&quot;4:5:6&quot;]</p>
<p>=======================</p>
<p>6） +，&lt;&lt;，和concat。 ruby中字符串的连接有三个方式。用+号可以新建一个字符串，用&lt;&lt;和concat可以修改原字串的值（不新建字符串）。因为&lt;&lt;和concat是修改址的方法，影响会比较大，切忌不要乱用。</p>
<p>=======================</p>
<p>a = &quot;123&quot;</p>
<p>b = &quot;456&quot;</p>
<p>p a + b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; &quot;123456&quot;</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; &quot;123&quot;</p>
<p> </p>
<p>a = &quot;123&quot;</p>
<p>b = &quot;456&quot;</p>
<p>a &lt;&lt; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; &quot;123&quot;</p>
<p> </p>
<p>a = &quot;123&quot;</p>
<p>b = &quot;456&quot;</p>
<p>a.concat(b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; &quot;123456&quot;</p>
<p>=======================</p>
<p>7） chomp! 。 删除行尾换行符。 以gets等方法从标准输入读入字符串时，行尾会接着换行符，但实际在处理字符串时，换行符经常很碍事，因此，加上chomp!几乎是一种固定写法。</p>
<p>=======================</p>
<p>a = &quot;123\n&quot;</p>
<p>p a.size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;4</p>
<p>a.chomp!</p>
<p>p a.size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;3</p>
<p> </p>
<p>while line = gets</p>
<p>&nbsp;&nbsp;&nbsp;  line.chomp!</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  ..</p>
<p>end</p>
<p>=======================</p>
<p>8） chop和chop!。 用于删除字符串的最后一个字符。</p>
<p> </p> <a href="http://hi.baidu.com/cly84920/blog/item/8f1c528bfa547bd9fc1f1058.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Ruby%20On%20Rails">Ruby On Rails</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/8f1c528bfa547bd9fc1f1058.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-27  18:13</pubDate>
        <category><![CDATA[Ruby On Rails]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/8f1c528bfa547bd9fc1f1058.html</guid>
</item>

<item>
        <title><![CDATA[ruby学习笔记(5)]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/3afee67a675585e72f73b3b0.html]]></link>
        <description><![CDATA[
		
		<p>Array 类</p>
<p>1）新建数组。 ruby中新建数组有多种方法。</p>
<p>&nbsp;&nbsp;&nbsp;  &lt;1&gt; 使用[]，类似于js。</p>
<p>================================</p>
<p>a = [1,2,3]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,3]</p>
<p>================================</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;2&gt; 使用Array.new。</p>
<p>================================</p>
<p>a = Array.new</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; []</p>
<p>a = Array.new(5)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [nil,nil,nil,nil,nil]</p>
<p>a = Array.new(5,0)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [0,0,0,0,0]</p>
<p>================================</p>
<p>&nbsp;&nbsp;  &lt;3&gt; 使用%w。 %w方法很奇怪，后面接的可以直接是字符串，而不必带&quot;号。通常情况下，可以选用()做为参数的边界符，如果字符串本身包含()这样的字符，为免造成影响，还可以使用&lt;&gt; || !! @@ AA这样的来做边界符。%w方法会以空格为分隔，将字符拆分成数组。</p>
<p>================================</p>
<p>a = %w(abc 123 def 456 ghi)</p>
<p>p a&nbsp;&nbsp;  #=&gt; [&quot;abc&quot;,&quot;123&quot;,&quot;def&quot;,&quot;456&quot;,&quot;ghi&quot;]</p>
<p>a = %w&lt;(abc) 1(23 g()h&gt;</p>
<p>p a #=&gt; [&quot;(abc)&quot;,&ldquo;1(23&rdquo;,&quot;g()h&quot;]</p>
<p>================================</p>
<p>&nbsp;&nbsp;&nbsp;  &lt;4&gt;其它对象的to_a方法。 比如说hash对象就可以通过to_a转换成数组。</p>
<p>================================</p>
<p>h = {&quot;name&quot; =&gt; &quot;adang&quot;,&quot;sex&quot; =&gt; &quot;male&quot;}</p>
<p>a = h.to_a</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[[&quot;name&quot;,&quot;adang&quot;],[&quot;sex&quot;,&quot;male&quot;]]</p>
<p>================================</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;5&gt;字符串的split方法。</p>
<p>================================</p>
<p>s = &quot;ab-123-cd-45&quot;</p>
<p>a = s.split(&quot;-&quot;)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;ab&quot;,&quot;123&quot;,&quot;cd&quot;,&quot;45&quot;]</p>
<p>================================</p>
<p>2） 数组的索引。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  &lt;1&gt; a[n]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这个用法和别的语言没啥区别，唯一奇怪的是n可以为负值，表示倒数。另外，a.slice(n)和a.at(n)效果和a[n]相同。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>p a[0]&nbsp;&nbsp;  #=&gt; a</p>
<p>p a[-2] #=&gt; c</p>
<p>p a.slice(-2) #=&gt; c</p>
<p>p a.at(-2) #=&gt; c</p>
<p>================================</p>
<p>&nbsp;&nbsp;&nbsp;  &lt;2&gt; a[n..m]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  会将a[n]到a[m]之间的范围建立出新的数组返回。a.slice(n..m)和a[n..m]效果相同。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>p a[1..3]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>p a[1..6]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>p a.slice(1..3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>p a[a]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>================================</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;3&gt; a[n,len]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从a[n]处开始获取len个元素，建立新数组并返回。a.slice(n,len)和a[n,len]效果相同。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>p a[1,2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;b&quot;,&quot;c&quot;]</p>
<p>p a[1,6]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>p a.slice(1,2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;b&quot;,&quot;c&quot;]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>================================</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;4&gt; a.values_at(n1,n2,...)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  a[n..m],a[n,len]方法新建的数组都只能是连续位置上元素，a.values_at方法可以返回不连续的索引组成的新数组。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>p a.values_at(1,3,0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;b&quot;,&quot;d&quot;,&quot;a&quot;]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&ldquo;d&rdquo;]</p>
<p>================================&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>3） 改写数组。a[n],a[n..m],a[n,len]不仅可以读数据，还能写数据。注a.at,at.slice方法都只能读，不能写，只有a[]可以写。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;,&quot;e&quot;,&quot;f&quot;,&quot;g&quot;]</p>
<p><br>
a[1..3] = [&quot;B&quot;,&quot;C&quot;,&quot;D&quot;]</p>
<p><br>
a[4,2] = [1,2]</p>
<p><br>
p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;B&quot;,&quot;C&quot;,&quot;D&quot;,1,2,&quot;g&quot;]</p>
<p>================================</p>
<p>4) 插入元素。 ruby中插入数据原理和js里一样。js中是通过splice方法先删几个元素，再添几个元素，ruby中也是如此。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;]</p>
<p>a[2,0] = [1,2]</p>
<p>p a&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,1,2,&quot;c&quot;]</p>
<p> </p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&ldquo;c&rdquo;]</p>
<p>a[1,1] = [1,2,3]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,1,2,3,&quot;b&quot;,&quot;c&quot;]</p>
<p> </p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;]</p>
<p>a[1..2] = [1,2,3]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,1,2,3]</p>
<p>================================</p>
<p>5） 交集、并集和差集。&nbsp;&nbsp;  ruby中数组还可以进行交集和并集的计算，分别使用 &amp; 和 | 作为运算符。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>b = [&quot;b&quot;,&quot;e&quot;,&quot;a&quot;]</p>
<p>p a &amp; b&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;]</p>
<p>p a | b&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&ldquo;d&rdquo;,&quot;e&quot;]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>================================</p>
<p>对数组直接使用 + - 运算符，可以分别得到数组连接的效果和差集的效果。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;]</p>
<p>b = [&quot;b&quot;,&quot;e&quot;,&quot;a&quot;]</p>
<p>p a - b&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;c&quot;,&quot;d&quot;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  （a有，但b没有的元素）</p>
<p>p&nbsp;&nbsp;  a + b&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;,&quot;b&quot;,&quot;e&quot;,&quot;a&quot;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (a和b简单地叠加)</p>
<p>p&nbsp;&nbsp;  a | b&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;,&quot;e&quot;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  （a和b的并集，重复元素去除）</p>
<p>================================</p>
<p>6）数组的队列性。 和js一样，ruby中的数据也有push,pop,unshift,shift方法，此外a &lt;&lt; 赞同于a.push。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;]</p>
<p>a.unshift(1)</p>
<p>a &lt;&lt; 2</p>
<p>a.push(3)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,2,3]</p>
<p>p a.shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 1</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&ldquo;a&rdquo;,&quot;b&quot;,&quot;c&quot;,2,3]</p>
<p>p a.pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 3</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>================================</p>
<p>7) a.concat和 + 。&nbsp;&nbsp;&nbsp;  在js中数组是不能直接相加的，如果需要组合两个数组，是用a.concat(b)来实现的，但js中a.concat(b)是会返回一个新数组的，还可以利用这一点轻松复制一个复杂类型的数组。但ruby中concat是具有破坏性的，会影响到a。如果想不影响到a，可以使用+号。</p>
<p>================================</p>
<p>a = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;]</p>
<p>b = [1,2,3]</p>
<p>c = a + b</p>
<p>p c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,1,2,3]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;a&quot;,&quot;b&quot;,&quot;c&quot;]</p>
<p>c = a.concat(b)</p>
<p>p c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,1,2,3]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,1,2,3]</p>
<p>================================</p>
<p>8）a.compact。 a.compact可以从数组中删除nil元素。有compcat和compact!之分。</p>
<p>================================</p>
<p>a = [nil,&quot;a&quot;,nil,&quot;b&quot;,&quot;c&quot;,nil]</p>
<p>a.compact!</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;]</p>
<p>================================</p>
<p>9）a.uniq。 a.uniq可以删除数组中的重复元素。有a.uniq和a.uniq!之分。</p>
<p>================================</p>
<p>a = [1,2,3,4,3,2,1]</p>
<p>a.uniq!</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,3,4]</p>
<p>================================</p>
<p>10） a.delete(x)、a.delete_at(n)、a.delete_if{|item| ...}</p>
<p>a.delete(x)可以直接从数组中删除指定元素(为啥js中没有这么好用的方法？T_T )。</p>
<p>a.delete_at(n)删除指定索引的元素（js的splice方法去死吧 T_T）。</p>
<p>a.delete_if{|item| ...} 遍历数组元素，如果区块返回结果为真，则删除。 （for循环去死吧 T_T）。</p>
<p>================================</p>
<p>a = [1,2,3,2,4,nil]</p>
<p>a.delete(2)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,3,4,nil]</p>
<p>a = [1,2,3,2,4,nil]</p>
<p>a.delete_at(2)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,2,4,nil]</p>
<p>a = [1,2,3,2,4,nil]</p>
<p>a.delete_if{|item| item &gt; 2 if item}</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,2,nil]</p>
<p>================================</p>
<p>11) a.slice!()。 前面说过a.slice的效果等同于a[]，包括a.slice(n),a.slice(n..m),a.slice(n,len)。slice方法还有slice!的形式，slice!方法的返回值相同，但会从数组中删除掉返回值。</p>
<p>================================</p>
<p>a = [1,2,3,4,5,6]</p>
<p>p a.slice!(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 2</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,3,4,5,6]</p>
<p>p a.slice!(2..3)&nbsp;&nbsp;&nbsp;  #=&gt; [4,5]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,3,6]</p>
<p>p a.slice!(1,1)&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [3]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,6]&nbsp;&nbsp;&nbsp;</p>
<p>================================</p>
<p>12） a.collect和a.map。 如果需要让数组中所有元素统一变化，再也不用for()去循环，再赋值这么麻烦了，a.collect和a.map都可以返回让数组中的值进行处理之后，将返回的结果组成新数组。a.collect和a.map效果相同，且都有!的形式。</p>
<p>================================</p>
<p>a = [1,2,3]</p>
<p>a.collect!{|item| item * 2}</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [2,4,6]</p>
<p>a.map!{|item| item * 3}</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [6,12,18]</p>
<p>================================</p>
<p>13） a.fill。 a.fill可以将数组a的元素改写为指定的参数。但我a[n..m]=和a[n,len]=不同的是，a.fill只能将指定范围内的元素修改成一种参数（只有一种）。a.fill有a.fill(value)，a.fill(value,begin)，a.fill(value,begin,end)，a.fill(value,n..m)几种不同的方式。</p>
<p>================================</p>
<p>a = [1,2,3,4,5,6]</p>
<p>a.fill(8)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [8,8,8,8,8,8]</p>
<p>a = [1,2,3,4,5,6]</p>
<p>a.fill(8,3)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,3,8,8,8]</p>
<p>a = [1,2,3,4,5,6]</p>
<p>a.fill(8,3,2)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,3,8,8,6]</p>
<p>a = [1,2,3,4,5,6]</p>
<p>a.fill(8,2..4)</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,8,8,8,6]</p>
<p>================================</p>
<p>14）a.flatten。 将数组扁平化，多层数组可以变成一个单层的数组。有a.flatten和a.flatten!之分.</p>
<p>================================</p>
<p>a = [1,[2,3],[[4,5],6,[7,[8,9]]]]</p>
<p>a.flatten!</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,3,4,5,6,7,8,9]</p>
<p>================================</p>
<p>15）a.reverse。 逆转数组，有a.reverse和a.reverse!之分。</p>
<p>================================</p>
<p>a = [1,2,3]</p>
<p>a.reverse!</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [3,2,1]</p>
<p>================================</p>
<p>16）sort和sort_by。 sort对数组排序，对应的还有sort!方法。另外ruby还提供sort_by方法，sort_by返回新数组，没有对应的sort_by!</p>
<p>=================================</p>
<p>a = [2,4,3,5,1]</p>
<p>a.sort!</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,3,4,5]</p>
<p>b = a.sort_by{|i| -i}</p>
<p>p b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [5,4,3,2,1]</p>
<p>p a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; [1,2,3,4,5]</p>
<p>=================================</p>
<p>17） each和each_width_index。 数组遍历最常用的做法是使用each方法，但each方法只会返回一个返回值，只有元素，没有索引，如果需要索引的话，可以使用each_with_index方法。</p>
<p>=================================</p>
<p>a = [1,2,3]<br>
a.each{|i| print i,&quot;\n&quot;}<br>
a.each_with_index{|i,n| print n,&quot; : &quot;,i,&quot;\n&quot;}</p>
<p>=================================</p> <a href="http://hi.baidu.com/cly84920/blog/item/3afee67a675585e72f73b3b0.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Ruby%20On%20Rails">Ruby On Rails</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/3afee67a675585e72f73b3b0.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-26  14:50</pubDate>
        <category><![CDATA[Ruby On Rails]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/3afee67a675585e72f73b3b0.html</guid>
</item>

<item>
        <title><![CDATA[ruby学习笔记(4)]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/7666b53811165b2996ddd8d7.html]]></link>
        <description><![CDATA[
		
		<p>Numeric类</p>
<p>1) 整型和整型相加结果为整形，整形和浮点型相加，结果为浮点型。</p>
<p>================================</p>
<p>p 1+1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;2</p>
<p>p 1+1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  #=&gt;2.0</p>
<p>p 3 * 2.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;6.0</p>
<p>================================</p>
<p>2) divmod。 除了+ - * / %之外，ruby中数值类型还有divmod方法，它也是除的运算符，只是返回值是数组的形式，第一项是商，第二项是余数。</p>
<p>================================</p>
<p>p  16.divmod(5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;  [3,1] </p>
<p>================================</p>
<p>3) Math模块和round方法。  ruby提供了Math模块，但和一般语言不同的是，round、ceil和floor方法并不是从属于Math模块的，而是直接绑定在数值类上的。Math模块提供的方法有sin、cos、tan、asin、acos、atan、exp、log、log10和sqrt。数值类型的对象转换可以用 to_f、to_i方法。浮点型转整型会直接去掉小数点后的值。字符串调to_i方法相当于js中的parseInt方法。</p>
<p>================================</p>
<p>f = 4</p>
<p>p Math.sqrt(f)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #=&gt; 2</p>
<p>include Math</p>
<p>p sqrt(f)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 2</p>
<p> </p>
<p>p&nbsp;&nbsp;  10.to_f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 10.0</p>
<p>p&nbsp;&nbsp;  10.8.to_i&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   #=&gt; 10</p>
<p>p&nbsp;&nbsp;&nbsp;  &quot;123&quot;.to_i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #=&gt; 123</p>
<p>p&nbsp;&nbsp;&nbsp;  &quot;123abc&quot;.to_i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #=&gt;  123</p>
<p>p&nbsp;&nbsp;&nbsp;  &quot;abc123&quot;.to_i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (不是nil哦)</p>
<p>p&nbsp;&nbsp;&nbsp;  1.2.round&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #=&gt; 1</p>
<p>p&nbsp;&nbsp;&nbsp;&nbsp; 1.2.floor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   #=&gt; 1</p>
<p>p&nbsp;&nbsp;&nbsp;&nbsp; 1.2.ceil&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; 2 </p>
<p>================================</p>
<p>3) 循环。 数值类型可以直接用来循环。</p>
<p>================================</p>
<p>ary = []</p>
<p>3.times{|i| ary &lt;&lt; i}</p>
<p>p ary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[0,1,2]</p>
<p> </p>
<p>ary = []</p>
<p>2.upto(5){|i|  ary &lt;&lt; i}</p>
<p>p ary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[2,3,4,5]</p>
<p> </p>
<p>ary = []</p>
<p>5.downto(2){|i|  ary &lt;&lt; i}</p>
<p>p ary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[5,4,3,2]</p>
<p> </p>
<p>ary = []</p>
<p>10.step(20,3){|i|  ary &lt;&lt; i}</p>
<p>p ary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[10,13,16,19]</p>
<p>10.step(2,-3){|i|  ary &lt;&lt; i}</p>
<p>p ary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;[10,7,4]</p>
<p>================================</p> <a href="http://hi.baidu.com/cly84920/blog/item/7666b53811165b2996ddd8d7.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Ruby%20On%20Rails">Ruby On Rails</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/7666b53811165b2996ddd8d7.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-24  18:07</pubDate>
        <category><![CDATA[Ruby On Rails]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/7666b53811165b2996ddd8d7.html</guid>
</item>

<item>
        <title><![CDATA[ruby学习笔记(3)]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/6dbe1cbf0e44460018d81fd3.html]]></link>
        <description><![CDATA[
		
		<p>1) sleep方法。 ruby中也有定时器，sleep相当于js中的setTimeout函数，不同的是sleep后的参数单位是秒，不是微秒。另外，js中的setTimeout是另起一个线程，不停止主线程继承往下执行，和ajax类似，ruby的sleep方法却是会阻止当前线程往下执行的。</p>
<p>2）ruby的函数中return是可以省略的，如果省略，方法中的最后一个语句的计算值会是返回值。</p>
<p>========================================</p>
<p>def area(x,y,z)</p>
<p>&nbsp;&nbsp;&nbsp;  xy = x * y</p>
<p>&nbsp;&nbsp;&nbsp;  yz = y * z</p>
<p>&nbsp;&nbsp;&nbsp;  zx = z * x</p>
<p>&nbsp;&nbsp;&nbsp;  (xy + yz +zx) * 2</p>
<p>end</p>
<p>p area(2,3,4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;52</p>
<p>========================================</p>
<p>3) 判断对象的类型。 ruby有个和js中判断对象类型相近的方法，instance_of?。除了instance_of?之外，ruby的对象还有个很好用的方法，叫class，通过class方法可以直接得到对象的类型，需要注意的是.class返回的不是字符串，而是类。</p>
<p>========================================</p>
<p>str = &quot;abc&quot;</p>
<p>arr = [1,2,3]</p>
<p>p str.class&nbsp;&nbsp;  #=&gt; String</p>
<p>p arr.class&nbsp;&nbsp;  #=&gt; Array</p>
<p>p str.instance_of?(String)&nbsp;&nbsp;  #=&gt; true</p>
<p>p arr.instance_of?(Array)&nbsp;&nbsp;&nbsp;  #=&gt; true</p>
<p>p str.class == String&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; true</p>
<p>========================================</p>
<p>和js一样，ruby中所有的类都继承自Object。但和js不一样的是，js的instanceof可以一直往上追踪，但ruby不行，ruby为往上追踪提供了另外一个方法is_a?。例如</p>
<p>=========================================</p>
<p>js:</p>
<p>var arr = [1,2,3];</p>
<p>alert(arr instanceof Array);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //true</p>
<p>alert(arr instanceof Object);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //true</p>
<p>ruby:</p>
<p>arr = [1,2,3]</p>
<p>p arr.instance_of?(Array)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; true</p>
<p>p arr.instance_of?(Object)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; false</p>
<p>p arr.is_a?(Object)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; true</p>
<p>==========================================</p>
<p>4) ruby中的常量真是容易定义，用大写字母开头的就是常量了。常量在修改值的时候会报警告。</p>
<p>5）类名。和js不一样的是，js中是出于习惯，提倡类名首字母大写，并没有做硬性要求。ruby的类名却强制性要求首字母大写。原因是ruby要求类名必须为常量。</p>
<p>6）构造函数。ruby的构造函数并不是和类名同名的方法，而是统一使用initialize方法。一般语言都可以设定构造函数的访问性，设计模式中的单独模式就是通过构造函数的访问性做的文章。as3中强制构造函数为public，而ruby强制构造函数为private。</p>
<p>7） 实例化。 ruby的实例化一个类，不是通过new 类名()这种通用方式，而是通过类名.new()。奇怪的ruby语法@_@。</p>
<p>8） 属性的访问性。 和java一样，ruby并不支持直接访问类中的属性，如果要访问类中的属性，需要先通过attr_reader:属性名（只读），attr_writer:属性名（只写），attr_accessor:属性名（读写）来设定属性的访问权限。ruby中没有var关键字，不能通过函数产生变量的作用域。在js里，我们可以在类中定义一个私有变量，在所有的方法中调用。私有变量只要定义为和方法在同一级别，那么它就可以在各个方法中负责通信。ruby中不能使用这种方法，ruby在类里没办法定义变量，只能在方法中定义变量。方法和方法之间如果想通信只能通过@变量，也就是实例变量进行通信。@变量就像是js中的this.xxx变量一样，但js中的this.xxx只能是public的，可读可写，ruby通过attr_xxxx可以控制@变量的访问性。</p>
<p>9）方法的访问性。方法的访问性是通过public,private和protected进行限制的。和一般语言将访问性关键字放在方法前面不同的是，ruby的访问性是通过public :方法名1，方法名2。。。这样的方式进行声明的。属性的访问性可以放在前面，但方法的访问性要放在方法之后，如果放在方法前面会出现方法未定义的报错。除了初始化方法恒化private，其它方法缺省为public。</p>
<p>10）类方法（静态方法）。 ruby中定义类方法有三种方法。</p>
<p>=========================================</p>
<p>1)</p>
<p>class HelloWorld</p>
<p>&nbsp;&nbsp;  def HelloWorld.hello(name)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print name,&quot; said Hello.&quot;</p>
<p>&nbsp;&nbsp;&nbsp;  end</p>
<p>end</p>
<p>HelloWorld.hello(&quot;John&quot;)</p>
<p>2)</p>
<p>class HelloWorld</p>
<p>..</p>
<p>end</p>
<p>class &lt;&lt; HelloWorld</p>
<p>&nbsp;&nbsp;  def hello(name)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print name,&quot; said Hello.&quot;</p>
<p>&nbsp;&nbsp;&nbsp;  end</p>
<p>end</p>
<p>HelloWorld.hello(&quot;John&quot;)</p>
<p>3)</p>
<p>class HelloWorld</p>
<p>&nbsp;&nbsp;  def self.hello(name)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print name,&quot; said Hello.&quot;</p>
<p>&nbsp;&nbsp;&nbsp;  end</p>
<p>end</p>
<p>HelloWorld.hello(&quot;John&quot;)</p>
<p>=========================================</p>
<p>需要注意的是，类方法不能访问实例变量。</p>
<p>11）类变量（静态变量）。ruby中类变量是通过加@@标识的。</p>
<p>12）类常量。类中还可以定义常量，还是要求大写字母开头。类中不能定义和方法平缓的变量，但是可以定义和方法平级的常量，常量可以被所有方法调用。类常量的调用方法是类名::常量名。</p>
<p>13）继承。 ruby中的继承不是使用extend关键字，它更简洁，使用&lt;就可以了。ruby也只支持单继承。</p>
<p>14) 类的示例。</p>
<p>========================================</p>
<p>class Dog<br>
attr_accessor:name<br>
def initialize(name = &quot;wang cai&quot;)<br>
&nbsp;&nbsp;  @name = name<br>
end<br>
def call<br>
&nbsp;&nbsp;  print &quot;I'm a dog , my name is &quot;, @name ,&quot;\n&quot;,Version,&quot;\n&quot;<br>
end<br>
def self.move(num=0)<br>
&nbsp;&nbsp;  print &quot;Dog had moved &quot;,num,&quot; bu\n&quot;<br>
&nbsp;&nbsp;  print Version,&quot;\n&quot;<br>
end<br>
Version = &quot;1.0&quot;<br>
public :call<br>
end</p>
<p>a = Dog.new<br>
a.name = &quot;huan huan&quot;<br>
a.call<br>
Dog.move(5)</p>
<p>class BigDog &lt; Dog<br>
def call<br>
&nbsp;&nbsp;  print &quot;I'm a big dog , my name is &quot;, @name,&quot;\n&quot;<br>
end<br>
end</p>
<p>b = BigDog.new(&quot;abc&quot;);<br>
b.call<br>
print Dog::Version</p>
<p>========================================</p>
<p>15）模块。模块是ruby特有的功能之一。模块和类很像，但和类最大的不同在于模块不能实例化，也不能继承。模块的作用有两个，一个是用于提供命名空间。第二提供Mix-in功能。Mix-in和继承很像，但它不是继承，在《javascript设计模式》一书里，将Min-in称为掺元继承，YUI提供的augment方法，思路就是Mix-in。模块是通过include关键字读入的，它和as中的with()方法有相似的地方，include了文件之后，前辍就可以不用写了。</p>
<p>16）模块的常量和类常用调用方法一样。模块名::常量名。模块的方法调用和类的方法调用不同，可以使用模块::方法名，也可以使用模块.方法名。</p>
<p>17）模块定义的方法默认是不对外部公开的，（模块内没有public private protect关键字），要将方法对模块外部公开，必须使用module_function。</p>
<p>===================================</p>
<p>module HelloModule</p>
<p>&nbsp;&nbsp;  Version = &quot;1.0&quot;</p>
<p>&nbsp;&nbsp;&nbsp;  def hello(name)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print &quot;Hello, &quot;,name,&quot;.\n&quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  end</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  module_function : hello</p>
<p>end</p>
<p>p HelloModule::Version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;&quot;1.0&quot;</p>
<p>HelloModule::hello(&quot;Alice&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; hello, Alice.</p>
<p>include HelloModule</p>
<p>p Version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;&quot;1.0&quot;</p>
<p>hello(&quot;Alice&quot;)&nbsp;&nbsp;&nbsp;  #=&gt;Hello, Alice</p>
<p>===================================</p>
<p>18） 异常处理。ruby中的异常处理和别的语言没有太大区别，只是关键字换了下。</p>
<p>===================================</p>
<p>begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #相当于try</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  input = open(file)</p>
<p>rescue =&gt; ex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #相当于catch</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print ex.message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #异常对象有class（异常类）、message（异常的信息）和backtrace（异常位置）方法</p>
<p>ensure&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #相当于finally</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input.close</p>
<p>end</p>
<p>===================================</p>
<p> </p> <a href="http://hi.baidu.com/cly84920/blog/item/6dbe1cbf0e44460018d81fd3.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Ruby%20On%20Rails">Ruby On Rails</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/6dbe1cbf0e44460018d81fd3.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-23  12:04</pubDate>
        <category><![CDATA[Ruby On Rails]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/6dbe1cbf0e44460018d81fd3.html</guid>
</item>

<item>
        <title><![CDATA[标签内联事件和event对象]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/0ba393a93a100af61f17a24d.html]]></link>
        <description><![CDATA[
		
		<p>event对象在IE和firefox下表现是不同的。在IE下，event是window对象的一个属性，是在全局作用域下的，而在firefox里，event对象是做为事件的参数存在的：</p>
<p>===========================</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; /&gt;</p>
<p>&lt;script type=&quot;text/javascript&quot;&gt;</p>
<p>document.getElementById(&quot;btn&quot;).onclick = function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  alert(arguments.length);</p>
<p>};</p>
<p>&lt;/script&gt;</p>
<p>===========================</p>
<p>这代代码在IE下弹出0，而在firefox下弹出1。在firefox下这个参数就是event对象了。</p>
<p>如果在标签内联事件中触发事件会如何呢？</p>
<p>===========================</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; onclick = &quot;handler();&quot; /&gt;</p>
<p>&lt;script type=&quot;text/javascript&quot;&gt;</p>
<p>function handler(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  alert(arguments.length);</p>
<p>};</p>
<p>&lt;/script&gt;</p>
<p>===========================</p>
<p>在IE和firefox下，这段代码弹出的都是0.也就是说，标签内联事件并没有被替换成</p>
<p>===========================</p>
<p>btn.onclick = handler;</p>
<p><br>
function handler(){</p>
<p><br>
alert(arguments.length);</p>
<p><br>
}</p>
<p>===========================</p>
<p>而是替换成了</p>
<p>===========================</p>
<p>btn.onclick = function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  handler();</p>
<p>}</p>
<p><br>
function handler(){</p>
<p><br>
alert(arguments.length);</p>
<p><br>
}</p>
<p>===========================</p>
<p>在标签内联事件中，我们使用arguments[0]可以在firefox下访问到event对象。</p>
<p>===========================</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; onclick = &quot;alert(arguments[0].type)&quot; /&gt;</p>
<p>===========================</p>
<p>因为不使用标签内联事件的话，我们可以给处理函数传参，从而指定arguments[0]的变量名，通常情况下，我们平时也的确是这么处理的：</p>
<p>===========================</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; /&gt;</p>
<p>&lt;script type=&quot;text/javascript&quot;&gt;</p>
<p>document.getElementById(&quot;btn&quot;).onclick = function(e){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  e = window.event || e;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //e兼容IE和firefox，指向event对象</p>
<p>};</p>
<p>&lt;/script&gt;</p>
<p>===========================</p>
<p>在标签内联事件中我们没办法指定参数名，是不是就没办法直接写个变量在IE和firefox下兼容地指event对象呢？不是的，可以用&ldquo;event&rdquo;这个变量名兼容地指向event对象，注意，只能是&ldquo;event&rdquo;，如果是&ldquo;a&rdquo;，&ldquo;b&rdquo;，&ldquo;Event&rdquo;之类的全都不行。可能是因为考虑到标签内联事件中无法指定参数变量名，所以故意留个了&ldquo;event&rdquo;这个关键字吧。</p>
<p>===========================</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; onclick=&quot;alert(event.type);&quot; /&gt;</p>
<p>===========================</p>
<p>这段代码在IE和firefox下都可以正常地弹出&ldquo;click&rdquo;。</p>
<p>有趣的是，标签内联事件中我们甚至可以写注释，可以使用字符串：</p>
<p>===========================</p>
<p>//只弹出1</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; onclick=&quot;alert(1);//alert(2);alert(3);&quot; /&gt;</p>
<p>//弹出1和3</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; onclick=&quot;alert(1);/*alert(2);*/alert(3);&quot; /&gt;</p>
<p>//弹出&ldquo;string&rdquo;</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; onclick=&quot;var a='abc';alert(typeof a);&quot;/&gt;</p>
<p>===========================</p>
<p>如果我们既用标签内联事件绑定了事件，又用DomNode.onxxxx绑定了事件，又会如何呢？</p>
<p>===========================</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; onclick=&quot;alert(123);&quot; /&gt;</p>
<p>&lt;script type=&quot;text/javascript&quot;&gt;</p>
<p>document.getElementById(&quot;btn&quot;).onclick = function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  alert(456);</p>
<p>};</p>
<p>&lt;/script&gt;</p>
<p>===========================</p>
<p>会如何呢？会弹出456，不弹出123。相当于</p>
<p>===========================</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; /&gt;</p>
<p>&lt;script type=&quot;text/javascript&quot;&gt;</p>
<p>document.getElementById(&quot;btn&quot;).onclick = function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  alert(123);</p>
<p>};</p>
<p>document.getElementById(&quot;btn&quot;).onclick = function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  alert(456);</p>
<p>};</p>
<p>&lt;/script&gt;</p>
<p>===========================</p>
<p>后面的处理函数把前面的处理函数覆盖掉了。如果我们给DomNode是通过attachEvent和addEventListener来绑定事件的呢？</p>
<p>===========================</p>
<p>&lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;click me&quot; onclick=&quot;alert(123);&quot; /&gt;</p>
<p>&lt;script type=&quot;text/javascript&quot;&gt;</p>
<p>function handler(){</p>
<p><br>
alert(456);</p>
<p><br>
}</p>
<p><br>
if(document.all){</p>
<p><br>
btn.attachEvent(&quot;onclick&quot;,handler);</p>
<p><br>
} else {</p>
<p><br>
btn.addEventListener(&quot;click&quot;,handler,false);</p>
<p><br>
}</p>
<p>&lt;/script&gt;</p>
<p>===========================</p>
<p>很顺利地，先弹出了123，后又弹出了456。</p>
<p> </p> <a href="http://hi.baidu.com/cly84920/blog/item/0ba393a93a100af61f17a24d.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Js">Js</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/0ba393a93a100af61f17a24d.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-22  20:30</pubDate>
        <category><![CDATA[Js]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/0ba393a93a100af61f17a24d.html</guid>
</item>

<item>
        <title><![CDATA[关于prototype]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/de3627037b4262e609fa93a4.html]]></link>
        <description><![CDATA[
		
		<p>&nbsp;&nbsp;  protype是个很有趣的属性，它是&ldquo;类&rdquo;所持有的属性。在javascript里原生提供的一些内置类，其本质也是&ldquo;类&rdquo;，内置类提供的方法我们也可以通过prototype来覆盖掉，这是件很有趣的事情。例如：</p>
<p>=========================================</p>
<p>var str = str2 = &quot;ab,cd,ef,g&quot;;<br>
var arr = str.split(&quot;,&quot;);<br>
String.prototype.split = function(a){<br>
&nbsp;&nbsp;  return &quot;hello,you input: &quot; + a;<br>
}<br>
String.prototype.length = 200;<br>
var arr2 = str2.split(&quot;,&quot;);<br>
alert(str.length);<br>
alert(arr);<br>
alert(arr2);<br>
Array.prototype.toString = function(){<br>
return &quot;12345&quot;;<br>
}<br>
alert(arr);</p>
<p>=========================================</p>
<p>猜猜看，会依次弹出什么?&ldquo;10&rdquo;，&ldquo;ab,cd,ef,g&rdquo;，&ldquo;hello,you input: ,&rdquo;，&ldquo;12345&rdquo;。呵呵，看来属性没办法覆盖，第一个没弹出&ldquo;200&rdquo;，但方法可以覆盖，不论是String类的split方法，还是Array类的toString方法，都被我们覆盖掉了。</p>
<p>当然，覆盖内置类提供的方法这种操作绝大部分时候都是不好的，通常情况下，我们更多的是为内置类提供更多的方法，让程序更好用，例如：</p>
<p>==========================================</p>
<p>var arr = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;];<br>
var str = arr.join(&quot;-&quot;);<br>
alert(str);<br>
Array.prototype.join2 = function(a){<br>
return this.join(&quot;^^^&quot;+a+&quot;^^^&quot;);<br>
}<br>
str = arr.join2(&quot;-&quot;);<br>
alert(str);</p>
<p>==========================================</p>
<p>我们给内置类添加一个join2方法，让它在join数组的时候，能做更多我们自定义的事。因为修改的是内置类的原型，所以js中所有的原生数据都直接获得了新的方法，这是种很方便的功能。但这样的方法其实并不推荐，它会对原生内置类的原型造成&ldquo;污染&rdquo;，可能会出现奇怪的问题，特别是多人合作的时候，或者引入第三方js库的时候，出现一些奇怪的bug，查都不好查。我们更推荐的方法是定义一个新的类，然后把所有需要扩展的功能放到这个新的类里去，通过这个新的类来完成功能，而不是直接修改原型。如：</p>
<p>===========================================</p>
<p>var arr = [&quot;a&quot;,&quot;b&quot;,&quot;c&quot;];<br>
var str = arr.join(&quot;-&quot;);<br>
alert(str);<br>
arrayManager = {<br>
&nbsp;&nbsp;  join : function(oarr,ostr){<br>
&nbsp;&nbsp;  return oarr.join(&quot;^^^&quot;+ostr+&quot;^^^&quot;);<br>
&nbsp;&nbsp;  }<br>
}<br>
str = arrayManager.join(arr,&quot;-&quot;);<br>
alert(str);</p>
<p>===========================================</p>
<p>prototype是什么意思呢？它表示&ldquo;原型&rdquo;，简单地说，js中的类是分两级来实现的，一级是&ldquo;原型级&rdquo;，它比较底层，另一级是&ldquo;实例级&rdquo;，实例级的优先级比原型级高，如果new一个类，调用方法的时候，先优先在实例级去查找有无这个方法，如果没有，才会去原型中找。实例级在分配内存时会为每个实例分配一个，而原型级只会在内存中分配一个，通过传址的形式传给每个类的实例。所以为了节约内存，我们更推荐写类的时候将方法通过prototype的方式写出来，而不要写在function里，例如：</p>
<p>=========================================</p>
<p>//不推荐的写法</p>
<p>function Dog(){</p>
<p>&nbsp;&nbsp;&nbsp;  this.name = &quot;WangCai&quot;;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  this.call = function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  alert（&quot;wang wang&quot;）;</p>
<p>&nbsp;&nbsp;&nbsp;  }</p>
<p>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>//推荐的写法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>function Dog(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  this.name = &quot;WangCai&quot;;</p>
<p>}</p>
<p>Dog.prototype = {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  call : function(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  alert(&quot;wang wang&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  }</p>
<p>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>=========================================</p>
<p>正因为prototype是通过传址的方式供各实例调用的，所以如果对prototype进行了修改，无需重新再new一遍，实例的方法就已经更改了：</p>
<p>=========================================</p>
<p>function Dog(name){<br>
&nbsp;&nbsp;  this.name = name;<br>
}<br>
Dog.prototype.call = function(){<br>
alert(&quot;I'm &quot;+this.name);<br>
}<br>
var myDog = new Dog(&quot;WangCai&quot;);<br>
myDog.call();<br>
Dog.prototype.call = function(){<br>
alert(&quot;wang wang wang wang wang&quot;);<br>
}<br>
myDog.call();</p>
<p>function Cat(name){<br>
&nbsp;&nbsp;  this.name = name;<br>
&nbsp;&nbsp;  this.call = function(){<br>
&nbsp;&nbsp;  alert(&quot;I'm &quot;+this.name);<br>
&nbsp;&nbsp;  }<br>
}<br>
var myCat = new Cat(&quot;Mimi&quot;);<br>
myCat.call();<br>
Cat.prototype.call = function(){<br>
alert(&quot;miao miao miao miao miao&quot;);<br>
}<br>
myCat.call();</p>
<p>=========================================</p>
<p>myDog第一次call的时候，弹的是I'm WangCai,第二次就是wang wang wang wang wang了 ;myCat两次都弹的是I'm Mimi。</p>
<p> </p>
<p>正是因为prototype的这种特性，所以open api的系统里，因为会支持第三方开发，为了防止第三方恶意覆盖掉javascript内置类的方法，都会封装一套接口给第三方使用，以阻止它们访问原生内置类的原型。</p> <a href="http://hi.baidu.com/cly84920/blog/item/de3627037b4262e609fa93a4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Js">Js</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/de3627037b4262e609fa93a4.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-22  00:22</pubDate>
        <category><![CDATA[Js]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/de3627037b4262e609fa93a4.html</guid>
</item>

<item>
        <title><![CDATA[ruby学习笔记(2)]]></title>
        <link><![CDATA[http://hi.baidu.com/cly84920/blog/item/7709a6097e6012a52fddd42c.html]]></link>
        <description><![CDATA[
		
		<p>1）ruby的语句可以换行。这一点和js不同，js中换行视作一行语句结束，相当于在句尾加了&ldquo;;&rdquo;号，如果一条语句换行写，会报错。ruby中语句可以换行，而且为了提高可读性，bury鼓励不使用&ldquo;;&rdquo;号，希望一行语句只写在一行里，可以的话，不要在同一行里写多条语句。</p>
<p>2）ruby中if，while等语句都不带{}号，相反，一些方法例如each则会带{}，习惯了C系的语法，看着还真不习惯。总之因为不带{}，所以在写if等语句时，一定要注意缩进，不然程序没法看了。</p>
<p>3）ruby中空格不能随便乱加，如果要加空格让程序好看一点，一定要注意讲求平衡。例如：</p>
<p>==============================</p>
<p>a+b</p>
<p>a + b&nbsp;&nbsp;  的效果相同</p>
<p>a +b 效果却等同于 a(+b)，a（）方法传入+b作为参数</p>
<p>==============================</p>
<p>4） to_i 方法。字符串转换成数字类型。相当于js中的parseInt()。</p>
<p>5） 布尔型转换。 在ruby中，布尔型也是为true和false，同其它语言一样，其它类型的值也能和布尔型进行隐式转换。但和大多数语言不同的是，在ruby中，false和nil以外所有的对象都为真，false和nil为假。包括0，在ruby中其实都是相当于真，这点和一般的语言不大一样。另外，ruby是个支持谓语的语言，鼓励返回布尔型数据的方法命名时加上&ldquo;?&rdquo;，这么做也是为了提高可读性。例如 isNumber? isGood?</p>
<p>6) 条件判断。 在ruby中，条件判断有一点很奇怪的是else if的写法，既不是&ldquo;else if&rdquo;也不是&ldquo;elseif&rdquo;，是&ldquo;elsif&rdquo;，汗，为啥把那个e给省掉了？看着多别扭啊。。。</p>
<p>============================</p>
<p>a = ARGV[0]<br>
b = ARGV[1]<br>
if a &gt; b then<br>
print &quot;a &gt; b&quot;<br>
elsif a == b then<br>
print &quot;a = b&quot;<br>
else <br>
print &quot;a &lt; b&quot;<br>
end</p>
<p>============================</p>
<p>除了if，ruby中还提供了unless方法，语法和if一样，但和if正相反的是，unless中的条件不成立时，才会执行。</p>
<p>7） case语句。 ruby 中的case语句相当于其它语言中常用的switch，但ruby中的格式奇怪一点，功能也更强一点：</p>
<p>=============================</p>
<p>=begin</p>
<p>这是一般的用法</p>
<p>=end</p>
<p>tags = [&quot;A&quot;,&quot;IMG&quot;,&quot;PRE&quot;]</p>
<p>tags.each{ | tagname |</p>
<p>&nbsp;&nbsp;  case tagname</p>
<p>&nbsp;&nbsp;&nbsp;  when &quot;P&quot;,&quot;A&quot;,&quot;I&quot;,&quot;B&quot; then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #bury这里可以写多个参数，用逗号隔开</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print tagname,&quot;has child.\n&quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  when &quot;IMG&quot;,&quot;BR&quot; then</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print tagname,&quot;has no child.\n&quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print tagname,&quot;cannot be used.\n&quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  end</p>
<p>}</p>
<p> </p>
<p>=begin</p>
<p>when 里还可以放 String,Numberic之类的类型名，判断类型</p>
<p>=end</p>
<p>array = [&quot;aa&quot;,1,nil]</p>
<p>item = array[0]</p>
<p>case item</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  when String</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  puts &quot;item is a String.&quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  when Numberic</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  puts &quot;item is a Numeric.&quot;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  puts &quot;item is a something.&quot;</p>
<p>end</p>
<p> </p>
<p>=begin</p>
<p>when 里还可以放正则表达式</p>
<p>=end</p>
<p>case line</p>
<p>when /^From:/i</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  print &quot;找到寄件人了。\n&quot;</p>
<p>when /^To:/i</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  print &quot;找到收件人了。\n&quot;</p>
<p>else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  print &quot;啥也没找到。&quot;</p>
<p>end</p>
<p>=============================</p>
<p>需要注意的是，ruby中的when后面的条件不会自动转换类型，比如说1和&quot;1&quot;是不一样的。另外，很重要的一点是，when后面的语句不需要加break，这和C系的switch是不一样的。</p>
<p>8） ===。ruby中也有===号，但它和js中的===并不相同，ruby中的===左边可以是数字、字符串，也可以是正则，还可以是类型。</p>
<p>=============================</p>
<p>p (2 === 2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt; true</p>
<p>p /zz/ === &quot;zyzzy&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #=&gt; 2</p>
<p>p String === &quot;xyzzy&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  #=&gt;true</p>
<p>=============================</p> <a href="http://hi.baidu.com/cly84920/blog/item/7709a6097e6012a52fddd42c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cly84920/blog/category/Ruby%20On%20Rails">Ruby On Rails</a>&nbsp;<a href="http://hi.baidu.com/cly84920/blog/item/7709a6097e6012a52fddd42c.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-20  14:59</pubDate>
        <category><![CDATA[Ruby On Rails]]></category>
        <author><![CDATA[cly84920]]></author>
		<guid>http://hi.baidu.com/cly84920/blog/item/7709a6097e6012a52fddd42c.html</guid>
</item>


</channel>
</rss>