sevk sevk
关注数: 30 粉丝数: 57 发帖数: 1,004 关注贴吧数: 22
Ruby1.9之字符串内编码和外编码 作者:hooopo 时间:2011年12月07日 00:32 评论(4) Ruby1.9的字符串编码改动非常大。在Ruby1.8,每个字符串都是字节序列,没有字符的概念。唯一一个和字符编码有关的$KCODE可以指定全局的编码。 但是$KCODE对字符串编码的改变很小,因为$KCODE只做了这样几件事: 让ruby解析器按照$KCODE的编码方式解析源代码 让inspect方法按$KCODE的编码方式显示字符 让正则按照$KCODE的编码方式匹配 影响inspect ree-1.8.7-2011.03 :016 > $KCODE = "a" => "a" ree-1.8.7-2011.03 :017 > p "Résumé" "R\303\251sum\303\251" => nil ree-1.8.7-2011.03 :018 > p "你好" "\344\275\240\345\245\275" => nil ree-1.8.7-2011.03 :019 > $KCODE = "U" => "U" ree-1.8.7-2011.03 :020 > p "你好" "你好" => nil ree-1.8.7-2011.03 :021 > p "Résumé" "Résumé" => nil 影响正则: ree-1.8.7-2011.03 :027 > $KCODE = "a" => "a" ree-1.8.7-2011.03 :028 > "你好".scan(/./) => ["\344", "\275", "\240", "\345", "\245", "\275"] ree-1.8.7-2011.03 :030 > $KCODE = "U" => "U" ree-1.8.7-2011.03 :031 > "你好".scan(/./) => ["你", "好"] 并且,$KCODE是一个全局的变量,它对所有文件产生作用,这在你的程序里引入了第三方库,时候会遇到麻烦。 Ruby1.9对字符编码的控制分的很细: 源文件编码 外编码 内编码 [h1]源文件编码[/h1] Ruby1.9里,所有的字符串字面量都由字符序列+编码标识组成。 可以通过一个magick comment(# encoding: utf-8)来声明源代码里的字符串字面量的编码标识。这个comment针对每个文件起作用,不像1.8的$KCODE是在全局起作用。可以通过force_encoding方法来改变字符的编码标识(force_encoding并未转换编码,只改变标识) # encoding: GBK puts ENCODING #=> GBK puts "".encoding #=> GBK str = "你好".force_encoding "UTF-8" puts str.encoding # => UTF-8 虽然force_encoding只改变了字符的编码标识,没有改变字节序列,但是,随着字符串的编码标识的改变,字符串的一些行为也跟着改变,比如inspect和each_char: ruby-1.9.3-rc1 :017 > str = "你好" => "你好" ruby-1.9.3-rc1 :018 > p str.encoding #<Encoding:UTF-8> => #<Encoding:UTF-8> ruby-1.9.3-rc1 :019 > str.each_char{|x| p "#{x}—> #{x.bytesize}"} "你—> 3" "好—> 3" => "你好" ruby-1.9.3-rc1 :020 > str.force_encoding "GBK" => "\x{E4BD}\x{A0E5}\x{A5BD}" ruby-1.9.3-rc1 :021 > str.each_char{|x| p "#{x}—> #{x.bytesize}"} "\x{E4BD}—> 2" "\x{A0E5}—> 2" "\x{A5BD}—> 2" => "\x{E4BD}\x{A0E5}\x{A5BD}" ruby-1.9.3-rc1 :022 > [h1]外部编码[/h1] 字符串的来源可能有两种,一种是前面提到的源文件,另外一种是从外部IO读取到的。 对于第一种我们可以直接通过magick comment来设置字符串的默认编码标识。而从外部IO读取到的字符编码标识是通过IO对象的external_encoding和internal_encoding来设置的。 hooopohooopo</span><span class="symbol">:~</span>/rubyist<span class="error">$</span> cat show_external_encoding.rb open(<span class="predefined-constant">__FILE__</span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">r:UTF-8</span><span class="delimiter">&quot;</span></span>) <span class="keyword">do</span> |file| puts file.external_encoding.name p file.internal_encoding file.each <span class="keyword">do</span> |line| p [line.encoding.name, line] <span class="keyword">end</span> <span class="keyword">end</span> hooopo<span class="instance-variable">hooopo:~/rubyist$ ruby show_external_encoding.rb UTF-8 nil ["UTF-8", "open(FILE, \"r:UTF-8\") do |file|\n"] ["UTF-8", " puts file.external_encoding.name\n"] ["UTF-8", " p file.internal_encoding\n"] ["UTF-8", " file.each do |line|\n"] ["UTF-8", " p [line.encoding.name, line]\n"] ["UTF-8", " end\n"] ["UTF-8", "end\n"] 上面的例子展示了,通过设置IO对象的外部编码,使读取过来的字符串有了默认的编码标识。 加上内编码的情况就更绕了: cat show_internal_encoding.rb open("baidu.html", "r:GBK:UTF-8") do |file| puts file.external_encoding.name p file.internal_encoding file.each do |line| p [line.encoding.name, line[100..200]] end end ruby show_internal_encoding.rb GBK #<Encoding:UTF-8> ["UTF-8", ">百度一下,你就知道 IO对象设置了内编码以后,会自动帮你把读来的字符串从外编码转换成内编码。即: Iconv.iconv(internal_encoding, external_encoding, str) 如果IO对象的internal encoding和external encoding没有设置,他们会继承自Encoding.default_external 和 Encoding.default_internal 参考资源: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fblog.grayproductions.net%2Farticles%2Fruby_19s_three_default_encodings&urlrefer=dae96808a0109aede1e92616c3ae2187 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.ruby-forum.com%2Ftopic%2F178589&urlrefer=46dbd34d99f668553b30d26e2acee6d6
RubyConfChina 2013 幻灯片汇集(基本更新完成) RubyConfChina 2013 幻灯片汇集(基本更新完成) 大会的幻灯片基本更新完成。@lilu 你的幻灯片呢?赶紧上传吧。就差你了。 下面有人反映百度网盘不靠谱,所以我补充了相关的Dropbox链接(非全部)作为备选方案。 Day 1 Zach Holman -- "More Git and GitHub Secrets" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fruby-china.org%2Ftopics%2F14914&urlrefer=3c70640b63552143106ea0223c265f20 Daniel Bovensiepen -- "Shrink To Grow" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1BY5UQ&urlrefer=771493f8b5bc7f82206ba684b97a6068 http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fe3lstc6yud74n4m%2FShrinkToGrow_RubyConfChina_2013.pdf&urlrefer=f122e7b4080d7f4480f62d2cb7cadf26 肖雪洁 -- "Writing Ruby web server for node.js" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1BY67i&urlrefer=5fd9aaa6ecdacd4aced79078087c17b6 http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fi7qcbwu502hjx5n%2FWebrubyTalk.zip&urlrefer=f3764f67560e1089f3c4aa50f3422dde ihower -- "从 Classes 到 Objects:那些 OOP 教我的事" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.slideshare.net%2Fihower%2Fclasses-objects-oop&urlrefer=f458d8b720e8065ee78ecaeb08ed4f1d 吕戈 -- "How To Build A Sync-Like Async Web Server" http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fspeakerdeck.com%2Fluikore%2Fbuilding-an-async-server-with-fiber&urlrefer=550cee19eebe725967ebd257f0cce65e Jack Chen -- "Test your Rails application with pleasure" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1mqeKq&urlrefer=4722bb6f3d9d71f996eeca2c7ceaddd1 http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2F9gisd6g9gyj6ny3%2FTest%2520your%2520Rails%2520application%2520with%2520pleasure.pdf&urlrefer=7f49c6f6e2c66ed3efc0f3a0ba317fa8 Kevin Dewalt -- "How entrepreneurs can use Ruby and Rails to accelerate their companies with Lean Startup strategies." http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1KLRN&urlrefer=89900869842f606fae9b5d184a72d0db http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fs5zh7tez5qzi4k4%2FKevin%2520Dewalt.pdf&urlrefer=0905a21b95e645940c9de7f30f66a466 Obie Fernandez -- "Burning Ruby Lessons from Burning Man applied to theRuby Community" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1Du1ch&urlrefer=8f02f9dbe4a9662c46cd2ba14a28093c http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2F86sqfppcbszr9l9%2FBurningRuby.pdf&urlrefer=7ec1c4adb290f50c81514270c43296e8 Day 2 朱琅 -- "Ruby 在京东云擎中的使用" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1qZMVO&urlrefer=cbc677270e7238bba10e6cb1ecec30d3 http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fhrekldvmxhmhema%2Fruby%25E5%259C%25A8%25E4%25BA%25AC%25E4%25B8%259C%25E4%25BA%2591%25E6%2593%258E%25E7%259A%2584%25E4%25BD%25BF%25E7%2594%25A8.ppt&urlrefer=08f16c6a3b53f918ea61ceed9aeeba59 Prem -- "Hidden gems in Ruby on Rails" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1wz1ik&urlrefer=dcbf92406cdd2c5594e54516e444c9ba http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fx2sj408rsx1ct9y%2FHidden%2520gems%2520in%2520Ruby%2520on%2520Rails.pdf&urlrefer=30b089a8fae7aed8987e42c8126da5ae 鲁葳 -- "RSpec: the good parts and the tricky parts" http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fdl.dropboxusercontent.com%2Fs%2F0r295452bkjpduv%2Frspec-talk.pdf&urlrefer=1d5ad85c4e12fa9db0ab35d75a4aed3c http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fqgc7udt63cah6re%2Frspec-talk.pdf&urlrefer=dbf309f4c4b98da29242aa1aaebc3a6a Ian -- "Migration to JRuby: what we learned" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1xfyzx&urlrefer=181d9b5b7413f29a0150a6c98f4ba0cd http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2F8s6i5m71otbxxo1%2FMigrate%2520to%2520JRuby.pdf&urlrefer=c5277011d1ba4f0fc4b60cbc922f0d4e 陈金洲 -- "Rails 项目架构演进" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1qtPeF&urlrefer=e7ae4a5b5d48b88bd8b4ba9715ecc1fa http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fjy7hpco56c18qu7%2F%25E4%25BC%2581%25E4%25B8%259A%25E7%25BA%25A7Rails%25E6%259E%25B6%25E6%259E%2584%25E6%25BC%2594%25E8%25BF%259B%25E6%258C%2587%25E5%258D%2597.pdf&urlrefer=0d38d228f16c9b8937b38b1f5b02652f 杨濯宇 -- "Discovering Better Object Oriented Design with Tests" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1zhqyB&urlrefer=afb36d3933e5d7a13b01e543c3d30b68 http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fzsimd91djmpld2z%2FDiscoving_better_oop_design_with_test.pdf&urlrefer=920787d22db4c513d66999e72a751401 李路 -- "Artisan & Artist" [ @lilu ] XDite -- "Maintainable Rails View" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fruby-china.org%2Ftopics%2F15077&urlrefer=ce29379b062e1a877b2041d68dd5a177 Dave Thomas -- "红宝石,编码乐 (Code Ruby, Be Happy)" http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fpan.baidu.com%2Fs%2F1mWbHf&urlrefer=88501e5cbb8b1b2698ce6dab3b2c5e33 http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fwww.dropbox.com%2Fs%2Fvcqxpxxciimh1oo%2FChinaRuby2013.pdf&urlrefer=a748df2f94a35fe407c9e2d66e9e6f94 这次去北京很High,见到很多有意思的朋友,学习到了很多东西。 再次感谢 @ouyang 老师提供借宿和盛情款待。 原文: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fruby-china.org%2Ftopics%2F15151&urlrefer=15b6ddc1be5ca68dce35e4417718d47a
Windows平台下的3款重量级Ruby IDE 一、RadRails RadRails是由Aptana公司开发的基于Eclipse平台的Ruby on Rails(ROR) IDE,开源且免费,熟悉Eclipse的开发人员很容易使用。 RadRails官方下载地址:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.aptana.com%2Fproducts%2Fradrails%2Fdownload&urlrefer=6e41209c218772bd36a83b2d2c4b8c84 RadRails目前最新版本是RadRails 2.0.5。官方提供了 RadRails 独立版本(Standalone Version)和 Eclipse插件版本(Eclipse Plug-in Version)。 如果你本机以前没有安装过Eclipse,直接安装独立版即可。 如果本机已经安装了Eclipse,可以安装插件版RadRails,步骤如下: 以 Eclipse 3.7.1为例  1、打开Eclipse,从帮助菜单中选择“Install New software...” 打开软件安装对话框。  2、将下面的RadRails插件在线安装URL 复制并粘贴到 Work with 文本框中。按回车键。    http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fdownload.aptana.com%2Ftools%2Fradrails%2Fplugin%2Finstall%2Fradrails-bundle&urlrefer=9da077978bd8d1eee734981a1110f5f9  3、这时会出现一个有关RadRails组件的复选框列表,点击 “Select all” 全部选中,点击下面的“Next”按钮继续。  4、这时出现授权页面,选择“I accept the terms of the license agreement",接受条款。并点击 “Finish” 按钮完成。  5、重新启动Eclipse。二、NetBeans NetBeans 由 Sun 公司在2000年创立,它是开放源运动以及开发人员和客户社区的家园,旨在构建世界级的Java IDE。NetBeans IDE 是一个为软件开发者而设计的自由、开放的集成开发环境,你可以在这里获得许多需要的工具,包括建立桌面应用、企业级应用、 WEB 开发和 JAVA 移动应用程序开发、C/C++,甚至Ruby。NetBeans IDE 可以非常方便的安装于多种操作系统平台,包括 Windows、Linux、Mac OS 和 Solaris 等操作系统。 NetBeans 官方地址:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fnetbeans.org%2Fdownloads%2Findex.html&urlrefer=e26f0d8c04e6d03057c9569f372bffbe NetBeans 目前最新版本是 NetBeans 7.1 NetBeans 6.x 系列版本,提供Ruby包。你可以下载NetBeans完整版或者NetBeans Ruby版。 NetBeans 7.0 版开始 不再提供Ruby包,不过我们可以通过插件方式支持Ruby。方法如下: 打开NetBeans,从菜单选择“工具”=>“插件”打开插件对话框,选中“可选插件”选项卡,从复选框列表中选中 ruby on rails 项,点击“安装”。 Tom Enebo最近发布了针对NetBeans IDE 7.1的社区Ruby开发插件。插件下载:community-ruby_7_1_preview1.zip 安装步骤如下: 在NetBeans IDE 7.1中选择“工具”->“插件”菜单 选择“下载”选项卡 点击“添加插件...” 浏览到解压缩后的nbms文件目录 选择所有扩展名为.nbms的文件 接受并安装 安装后,你可以像往常一样,通过“文件”->“新建项目”来开始你的开发工作,然后选择已通过插件注册的Ruby或者Ruby on Rails模板即可。 参考:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fblog.enebo.com%2F2012%2F01%2Fworkaround-for-ruby-support-on-netbeans.html&urlrefer=e4995a3e9c0e31e877bc79ee40166f93 三、RubyMine RubyMine 是一个全新的为Ruby 和 Rails开发者准备的 IDE。RubyMine由 JetBrains 开发(JetBrains最著名的产品之一就是Java IDE:IntellJ IDEA了!)。RubyMine 是建立在IntellJ IDEA平台之上,提供所有必须的IDE功能,比如编辑,调试工具,源代码控制集成,代码自动提示完成,以及其他功能。专门为ruby打造的功能有基于 GUI 支持的 RSpec 和 Test::Unit。RubyMine 非开源且收费。提供30天试用版下载。 RubyMine 官方下载地址:http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.jetbrains.com%2Fruby%2F&urlrefer=cf89d2687167029e478fbf426d3aab1c
ruby1.8到1.9 的改变 (不到20项) 改进: 执行效率 Threads/Fibers Encoding/Unicode gems is (mostly) built-in now Single character strings. 12345678 Ruby 1.9 irb(main):001:0> "cat"[1] => "a" Ruby 1.8.6 irb(main):001:0> "cat"[1] => 97 String index. 12345678 Ruby 1.9 irb(main):001:0> "cat"[1] => "a" Ruby 1.8.6 irb(main):001:0> "cat"[1] => 97 {"a","b"} 写法不再支持123456789 Ruby 1.9 irb(main):002:0> {1,2} SyntaxError: (irb):2: syntax error, unexpected ',', expecting tASSOC Ruby 1.8.6 irb(main):001:0> {1,2} => {1=>2} Action: Convert to {1 => 2} Array.to_s 现在包含逗号了. 123456789 Ruby 1.9 irb(main):001:0>p [1,2,3] => "[1, 2, 3]" Ruby 1.8.6 irb(main):001:0>p [1,2,3] => "123" Action: Use [1,2,3].join instead when 条件 :冒号不再支持 12345678910 Ruby 1.9 irb(main):001:0> case 'a'; when /\w/: puts 'word'; end SyntaxError: (irb):1: syntax error, unexpected ':', expecting keyword_then or ',' or ';' or '\n' Ruby 1.8.6 irb(main):001:0> case 'a'; when /\w/: puts 'word'; end word Action: 使用分号或换新行 语句块里的变量是局部变量。 12345678910 Ruby 1.9 irb(main):001:0> i=0; [1,2,3].each {|i|}; i => 0 irb(main):002:0> i=0; for i in [1,2,3]; end; i => 3 Ruby 1.8.6 irb(main):001:0> i=0; [1,2,3].each {|i|}; i => 3 Hash.index 方法过时了,会出警告 123456789101112 Ruby 1.9 irb(main):001:0> {1=>2}.index(2) (irb):18: warning: Hash#index is deprecated; use Hash#key => 1 irb(main):002:0> {1=>2}.key(2) => 1 Ruby 1.8.6 irb(main):001:0> {1=>2}.index(2) => 1 Action: 使用 Hash.key Fixnum.to_sym 方法没了,会出Error 123456789101112131415 Ruby 1.9 irb(main):001:0> 5.to_sym NoMethodError: undefined method 'to_sym' for 5:Fixnum Ruby 1.8.6 irb(main):001:0> 5.to_sym => nil (Cont'd) Ruby 1.9 # Find an argument value by name or index. def [](index) lookup(index.to_sym) end svn.ruby-lang.org/repos/ruby/trunk/lib/rake.rb Hash的.Keys 现在是无序的。 12345678 Ruby 1.9 irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"} => {:a=>"a", :c=>"c", :b=>"b"} Ruby 1.8.6 irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"} => {:a=>"a", :b=>"b", :c=>"c"} 有序 :a :b :c 更严格的Unicode正则表达式 1234567 Ruby 1.9 irb(main):001:0> /\x80/u SyntaxError: (irb):2: invalid multibyte escape: /\x80/ Ruby 1.8.6 irb(main):001:0> /\x80/u => /\x80/u tr 和 Regexp Now 支持 Unicode 123456789101112131415161718 Ruby 1.9 unicode(string).tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT). gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR). gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]} pack and unpack Ruby 1.8.6 def xchr(escape=true) n = XChar::CP1252[self] || self case n when *XChar::VALID XChar::PREDEFINED[n] or (n>128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*'))) else Builder::XChar::REPLACEMENT_CHAR end end unpack('U*').map {|n| n.xchr(escape)}.join
windows下面的 netstat -ano 代码: #! /usr/bin/env ruby # =kk= # [email protected] # coding: utf-8# # require 'ipwry.rb' @i = IpLocationSeeker.new def addr(ip) return '' if ip =~ /^0\.|^127|^192|^10/ @i.seek(ip).togb end $t = {} `tasklist`.scan(/(^\w.+?)(\d+)\s*/m).each{|x,y| $t[y]=x.strip } p ARGV puts `netstat #{ARGV.join(' ')}`.gsub(/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:)/){ "#{addr($1)} #{$1}" }.gsub(/\s(\d+)$/m){$t[$1]} 运行netstat -ano 的效果: Active Connections Proto Local Address          Foreign Address        State TCP     0.0.0.0:135             0.0.0.0:0              LISTENING TCP     0.0.0.0:445             0.0.0.0:0              LISTENING TCP     127.0.0.1:2347          127.0.0.1:2348         ESTABLISHED TCP     127.0.0.1:2348          127.0.0.1:2347         ESTABLISHED TCP     127.0.0.1:2349          127.0.0.1:2350         ESTABLISHED TCP     127.0.0.1:2350          127.0.0.1:2349         ESTABLISHED TCP     192.168.0.248:2383     北京市联通ADSL 123.125.65.210:80      ESTABLISHED TCP     192.168.0.248:2384     北京市联通ADSL 123.125.65.210:80      ESTABLISHED TCP     192.168.0.248:2389     北京市联通ADSL 123.125.115.48:80      ESTABLISHED TCP     192.168.0.248:2449     美国加利福尼亚州山景市谷歌公司 64.233.183.166:80      E STABLISHED TCP     192.168.0.248:2452     美国加利福尼亚州山景市谷歌公司 66.249.89.154:80       E STABLISHED TCP     192.168.0.248:2456     美国加利福尼亚州山景市谷歌公司 64.233.183.157:80      E STABLISHED TCP     192.168.0.248:2458     美国加利福尼亚州山景市谷歌公司 64.233.183.157:80      E STABLISHED TCP     192.168.0.248:2461     北京市联通ADSL 123.125.65.111:80      CLOSE_WAIT TCP     192.168.0.248:2462     北京市联通ADSL 123.125.65.93:80       ESTABLISHED UDP     0.0.0.0:445            *:* UDP     0.0.0.0:1318           *:* UDP     0.0.0.0:3785           *:* UDP     10.0.1.5:123           *:* UDP     127.0.0.1:123          *:* UDP     192.168.0.248:123      *:*
从 C 和 C++ 到 Ruby 从 C 和 C++ 到 Ruby 由於 Ruby 跟 C/C++ 的差异实在太大,很难将两者间的差异一项一项列出。其中的一个重要理由是:Ruby 和 C 语言的「不隐藏内部机制(No hidden mechanism)」原则完全处在两个极端上。Ruby 选择让人们的工作更轻松,但让执行期环境(runtime)负担加重。除非你要开始对你的 Ruby 程式码做最佳化,你不需要关心编译器的脸色如何。 也就是说,你可以预期 Ruby 程式将会比等价的 C/C++ 程式慢的多。然而,你也会惊讶於只需要写这麼少的程式码,就可以迅速地完成你的 Ruby 程式。Ruby 能完全满足你的需求,又比C++简单的多。 Ruby 是动态型别(Dynamically typed),而不是静态型别(Statically typed)的程式语言。Ruby的执行期环境(runtime)会尽可能的处理所有工作。举例来说,你不需要事先知道你的 Ruby 程式将会被连结(link)到哪一个模组,或是哪一个方法(method)将会被呼叫。 幸运的是,Ruby 与 C 有著良好的共生关系。Ruby 支援所谓的「扩充模组」。这些由 C 语言写成的模组能够在 Ruby 程式中使用(而且看起来与一般 Ruby 模组无异)。因此,你可以将你的 Ruby 程式中影响效能最大的部份划分出去,用纯粹的 C 语言来完成这些部分。 最后,Ruby 本身理所当然的是用 C 语言写成。 与C语言的相似之处与C语言相同,在Ruby中... 你可以用程序式的方式写程式(但是底层依然是物件导向的环境。) 大多数的运算子都是相同的。(包含复合运算子跟位元运算子。)然而Ruby并没有++或是--运算子。 你可以使用__FILE__ 与 __LINE__。 你可以定义常数。虽然并没有特殊的 const 关键字,Ruby利用命名的惯例来强迫变数为常数:第一个字母为大写的变数便为常数。 字串由双引号包住。 字串是可变的。 就像man page一样,你可以利用ri指令在终端机视窗中阅读大多数的文件。 你也有一样的指令列debugger可以使用。与C++的相同之处与C++相同,在Ruby中... 大多数的运算子都是一样的(包含::),<<常常用来将元素串接在list之后。要注意的是:Ruby中你不需要使用->,永远只需要.。 public,private,与protected的功能在两者是类似的。 物件的继承一样只需要一个字元,只是从 : 变成 <。 可以将你的程式码放进模组(module)之中,类似 C++ 中的namespace 的作法。 例外(Exceptions)的运作方式类似。虽然为了保护无辜的人们,我们把关键字改了。与C语言的不同之处与C语言不同的是,在Ruby中... 物件是强型别。(变数名称则没有任何的型别定义。) 没有巨集(macro)或是前处理器(preprocessor)、没有转型、没有指标。 没有标头档(header files)、没有typedef、没有sizeof、也没有enums。 没有#define。用常数来代替他们便可。 在Ruby 1.8中,程式码在执行期才被解译,而不是被编译成任何一种机械语言或是byte-code。 所有的变数都存放在堆叠(heap)中。因此,你不需要自行释放他们,垃圾回收机制(Garbage collector)会处理他们。 方法的参数是传参考,而非传值。 用 require 'foo' 而不是 #include <foo> 或是 #include "foo"。 你不能在程式码中插入组合语言。 每行的结尾不需要分号。 在 if 和 while 这类条件运算式中,你可以省略括号。 呼叫方法的括号通常是选择性的。 你不会常常使用大括号。一般只需要使用 end 关键字来结束一个多行的区块(像是 while 回圈。) do关键字被称作「block」,Ruby中没有C语言的「do statement。」 「block」这个词在 Ruby 中有著不同的意义。它是指一段可以结合到一个方法呼叫的程式码,使得该方法的本体在执行时可以呼叫该段程式码。 你不需要事先宣告变数,当你需要一个变数时直接使用一个新名字就可以了。 当测试真值的时候,除了 false 与 nil 之外的东西都视为真(包含0,0.0,以及"0"。) Ruby没有字元(char)型别,只有长度为一的字串。 字串并不需要一个空位元组作为结束。 阵列宣告使用中括号而非大括号。 当你加入更多元素到阵列中时,阵列会自动变大。 如果你将两个阵列相加,你会得到一个更大的新的阵列,而不是指标运算的结果。 大多数的情况下,一切都是一个运算式。(也就是说,while之类的东西实际上会被当做一个rvalue。)与C++的不同与C++不同的是,在Ruby中... 你不能明确的定义参照(reference),Ruby中每个变数都会被自动解参照回原本的物件。 物件型别是强型别也是动态型别。Ruby执行期环境将会在执行期的方法呼叫成功时,自行辨识型别。 物件的建构子用 initialize 命名,而不是类别名称。 所有的方法都是虚拟(virtual)的。 类别变数(静态变数)的变数名称永远用 @@开头。 你不能直接存取成员变数,所有对公开的成员变数(在Ruby中称作属性, attribute)的存取都会透过方法呼叫。 用self取代this。 有些方法会以 ’?’ 或是 ’!’结尾,这些符号都真的存在於方法名称中。 本质上,Ruby没有多重继承。然而,Ruby可以使用”mixin”。(也就是说,你可以「继承」某个模组的所有方法) 呼叫方法时的括号通常都可以省略。 你可以在任何时候重新打开一个类别以加入新的方法。 你不需要 C++ 的 template 机制。(因为你可以将某个变数设值为任何一种物件,型别将在执行期自动辨识。)你也不需要转型。 迭代(Iteration)的运作方式有些许不同,Ruby中你会让你的物件mixin Enumerator模组并且直接呼叫 my_obj.each 方法,而不是使用一个独立的迭代器(Iterator)。 Ruby只有两种容器类别:Array跟Hash。 Ruby没有型别转换,你也会发现在Ruby中你不需要它们。 Ruby内建了多执行绪。但是在Ruby 1.8之中只有”green threads”(只在直译器中有效的执行绪),而不是原生的执行绪。 Ruby的标准函式库中就包含了单元测试(Unit test)函式库。 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.ruby-lang.org%2Fzh_TW%2Fdocumentation%2Fruby-from-other-languages%2Fto-ruby-from-c-and-c-%2F&urlrefer=c617020eb78bdbb3e392c98a4f9b5911
1 下一页