燕之庐网站建设 - 优质网站设计公司

Posts Tagged ‘ruby’

ruby

2010/01/16

Ruby语言快速入门之对象,方法和类

Tags:

在Ruby中,一切都是对象。对于那些喜欢使用高度面向对象的语言(例如Smalltalk,Eiffel或CLOS)的用户来说,这是非常受欢迎的。例 如1,2,3或10.8等等都是对象,而不是如Java或C++中的原始类型;字符串是对象,类和方法也都是对象。例如,下面都是有效的Ruby代码(在 Ruby中,注释行是以”#”符号界定的):

#对象-34的绝对值
-34.abs
#对一个浮点数进行四舍五入处理
10.8.round
#返回一个字符串对象的大写且逆转的副本
“This is Ruby”.upcase.reverse
#返回数学sin方法的参数个数
Math.method(:sin).arity

图5.Ruby是全对象化的:在Ruby中,整数,浮点数,字符串,甚至类和方法都是对象。这里的代码展示了针对这些类型对象的方法调用。

在Ruby中,所有功能都是通过调用对象上的方法(或操作)实现的。事实上,Ruby中的方法调用就象其它程序语言中的函数或过程调用一样。

就象在所有面向对象程序语言中一样,对象是从类中创建的。Ruby库中提供了许多预构建的类。你可以修改这些类或构建你自己的类。Ruby中的类是使 用”class”关键字定义的。类名开始是一个大写字母。类定义以”end”关键字结束。因此,一个Rectangle类的定义可能有如下形式:

class Rectangle
end

为了把方法添加到类,可以使用def关键字。方法的定义也应该以end关键字结束。跟随def关键字和方法名后面就是方法参数。把一个area方法添加到上面的Rectangle类的代码看上去如下所示:

class Rectangle
def area (hgt,wdth)
return hgt*wdth
end
end

对于那些熟悉其它程序语言的用户,他可能注意到一些差别。Ruby并不使用任何花括号来限定类或方法,也不使用分号或其它字符来表示程序语句行的结束。 Ruby的目标,根据它的创建者说明,是简单、易用并使编码成为一件”趣事”。谁想记住所有的那些分号?没有意思!在Ruby中,只要你把语句放在一行 上,不需要分号或其它代码行结束标记。顺便说一下,在area方法参数周围的括号是不必要的。在默认情况下,Ruby返回一个方法中最后的内容,因此 return关键字也可以省略。因此,你可以建立如下简单编码的Rectangle类:

class Rectangle
def area hgt, wdth
hgt*wdth
end
end

尽管上面代码是有效的,但是小括号还是被推荐使用于方法参数表达的,这主要是为了实现较好的可读性。

北京网站建设公司

ruby

Ruby程序设计语言快速入门之安装Ruby

Tags:

提要 Ruby是一种面向对象的元编程语言,是它让许多开发者感到惊讶,甚至令他们提出这样的疑问:是否真正存在比Java和C#更好的语言?本系列教程将对Ruby语言作全面的探讨并试图回答这一问题。

一、 引言

你是否听说过Ruby?如今,它成了软件开发界的一个流行话题。该语言在去年春天的一次Java会议上引起我的注意,当时象Bruce Tate,Dave Thomas等著名人物都在谈论Ruby并且告诉在场的观众Ruby值得一看。

现在,如果你象我一样正在从事软件开发,那么我们就有共识:尽管学习一种新的编程语言可能是一件趣事,但是只有你对它具有深入了解之后,你才有资格以一 种怀疑眼光来看待另一种编程语言。毕竟,在上世纪八、九十年代的编程语言之争最终得出结论-从根本上看存在两大阵营:Java世界和微软基于.NET支持 的开发语言。并不是我不想学习另一种语言,其实我只是期望通过选择其它编程语言才能获得一定技术优势的日子早点结束。然而,由于前面几位著名人士的影响, 我决定一试Ruby。

好,假定”我已经到过山顶”,那么本系列文章就是我对Ruby的研究报告。

二、 安装Ruby

Ruby是一种开源的编程语言,由日本的Yukihiro Matsumoto在九十年代中期开发。你可以在www.ruby-lang.org站点得到Ruby。这种语言最初被作为一种脚本语言创建,可应用于许 多平台上,包括Linux、各种类UNIX、MS-DOS、Windows、BeOS、Amiga、Acorn Risc OS和MacOS X。当前Ruby的最新版本是1.8.4。对于使用Windows平台的用户,你可以点按这里来得到一个”one-click”型Windows安装程 序。随同基本的Ruby二进制文件和库文件,这一下载中还包含一些有用的(并且是免费的)IDE和工具,包括帮助文档和示例代码,RubyGems包管理 器,FreeRIDE(免费的Ruby IDE),Fox GUI库,fxri(一种搜索引擎和Ruby文档的GUI指南,还有一个交互式命令行工具)和SciTE(Scintilla文本编辑器IDE)。在写本 文时,Windows安装程序所提供的Ruby的”稳定”版本是1.8.2,还有一个1.8.4版本的预览版。注意,本文中的示例代码是用Windows 安装程序所提供的1.8.2版本编写的。

使用Windows安装程序安装Ruby是相当直接的事情。你只要下载并运行一个简单的可执 行安装文件(ruby182-15.exe),这个程序就会启动一个标准的安装向导。下载文件大约有15MB,在向导把Ruby安装到Windows平台 上后占大约40MB的硬盘空间。

对于那些偏爱自己的编辑器的程序员,大量的编辑器都提供了对Ruby的支持,包括 emacs,vim,JEdit,Jed,Nedit和Textpad。当然,还有著名的Ruby Eclipse工程。Ruby开发工具(RDT)是一种Eclipse插件,当前仍处于早期开发中,但是你可以从此处下载试用它。另外,市场上还有一些便 宜的Ruby IDE,Arachno Ruby就是其中之一。

运行Ruby

就象许多解释性语言一样,Ruby提供给程序员多种开发代码的方法。你可以使用命令行工具以交互方式运行Ruby或者创建一个Ruby程序文件,然后要求Ruby的解释器执行此程序。

在Windows中,打开命令行提示符窗口,在提示符上输入”Ruby”并回车(注意:你应该能够使系统沿Ruby的\bin目录找到Ruby可执行文 件)。那么,Ruby就会运行并等候你输入程序。输入下面的程序,然后按Ctrl+D再按回车键,你就会看到Ruby执行你的程序,如图1所示。

def convertCtoF (celsius)
print(celsius.to_s + ” degrees celsius is ” +
((celsius * 9)/5 + 32).to_s + ” degrees in
fahrenheit\n”)
end
convertCtoF(20)

图1.在Ruby中以交互方式运行摄氏到华氏温度转换计算

图1中的转换程序也可以用一种Ruby IDE或简单文本编辑器实现并保存到一个文件中-例如convertCtoF.rb(.rb是Ruby程序的常用文件类型)。现在,Ruby解释器将执行这个文件中的Ruby程序,见图2。


图2.运行convertCtoF.rb

那些熟悉Smalltalk,Common Lisp Object System(CLOS),或其它解释性编程环境的用户肯定都会熟悉交互的开发环境。交互特点允许你用小块编程代码进行试验。通过使用一个特殊的Ruby 批处理文件irb.bat,你就能够克服Ruby解释器的非交互性特征。图3显示了使用irb.bat命令启动的Ruby。现在,代码可以被逐行地输入, 解释和测试。


图3.交互式Ruby

交互式Ruby特征也被嵌入到若干工具中。例如,Ruby文档的图形接口fxri,不仅可作为一种语言指南,而且可以用作一种交互式Ruby解释器(见图4)。


图4.fxri的交互式Ruby能力:在此,fxri也用来运行和图3相同的Ruby命令,但这是从文档工具内部运行

北京网站建设公司

java, php, ruby

Java之父称PHP,Ruby以及C#,不足为惧

Tags: , ,

James Gosling上周参加了纽约的Sun 全球教育研讨会(World Wide Education & Research Conference),在会上这位Java 之父进行了演讲,并就提问进行了回答。

有些人问道当前Java 所面临的威胁时,Gosling给予了这样的回答,“PHP 和Ruby 是非常好的系统,但是它们作为脚本语言来发挥力量,只局限于网页这一领域内。”

当Gosling谈到Microsoft 的C# 时,“曾经一度我们很担心他们会做出创造性的东西——现在看他们要专注于一个平台是希望渺茫。”

“PHP 能够简化产品因为它是100%瞄准网页的,”然而对于Java,他说,“我们拥有平衡的艺术——简化与力量的双赢。”

最后James Gosling 说:“任何关于Java 相对PHP、Ruby还是其他语言的讨论都是没有意义的,我们同样在使用其他语言,你可以应用PHP 或者Python,以及其他语言与Java一起工作。许多人这样做。”

北京网站建设公司

ruby

深入理解Ruby语言中的String

Tags:

Ruby语言中的String是mutable的,不像java、C#中的String是immutable的。比如

str1=”abc”
str2=”abc”

在java中,对于字面量 的字符串,jvm内部维持一张表,因此如果在java中,str1和str2是同一个String对象。而在Ruby中, str1和str2是完全不同的对象。同样,在java中对于String对象的操作都将产生一个新的对象,而Ruby则是操纵同一个对象,比如:

str=”abc”
str.concat(”cdf”)

此时str就 是”abccdf”。Ruby对String是怎么处理的呢?我们只谈谈c ruby中的实现,有兴趣的先看看这篇文章《管窥Ruby——对象基础》。在ruby.h中我们可以看到String对象的结构,Ruby中的对象(包括 类也是对象)都是一个一个的struct,String也不能例外:

struct RString {
struct RBasic basic;
long len;
char *ptr;
union {
long capa;
VALUE shared;
} aux;
};
//ruby.h

显然,len是String的长度;ptr是一个char类型的指针,指向实际的字符串;然后是一个联合,这个稍后再说。如果你看看ruby.h可以发 现,几乎所有定义的对象结构都有一个struct RBasic。显然,struct RBasic包含由所有对象结构体共享的一些重要信息的。看看RBasic:

struct RBasic {
unsigned long flags;
VALUE klass;
};

其中的flags是一个多用途的标记,大多数情况下用于记录结构体的类型,ruby.h中预定义了一些列的宏,比如T_STRING(表示struct RString),T_ARRAY(表示struct RArray)等。Klass是一个VALUE类型,VALUE也是unsigned long,可以地将它当成指针(一个指针4字节,绰绰有余了),它指向的是一个Ruby对象,这里以后再深入。

那么联合aux中的capa和shared是干什么用的呢?因为Ruby的String是可变的,可变意味着len可以改变,我们需要每次都根据len的 变换来增减内存(使 用c中的realloc()函数),这显然是一个很大的开销,解决办法就是预留一定的空间,ptr指向的内存大小略大于len,这样就 不需要频繁调用realloc了,aux.capa就是一个长度,包含额外的内存大小。那么aux.shared是干什么的呢?这是一个VALUE类型, 说明它是指向某个对象。aux.shared其实是用于加快字符串的创建速度,在一个循环中:

ruby 代码

whiletruedo重复 a=”str”#以“str”为内容创建字符串,赋值给a a.concat(”ing”)#为a所指向的对象添加“ing” p(a)#显示“string” end

每次都重新创建一个”str”对象,内部就是重复创建一个char[],这是相当奢侈,aux.shared就是用于共享char[],以字面量创建的 字符串会共享一个char[],当要发生变化时,将字符串复制到一个非共享的内存中,变化针对这个新拷贝进行,这就是所谓的“copy-on- write”技术。解释了String的内部构造,貌似还没有介绍String是怎么实现mutable,我们写一个Ruby扩展测试下,我们想写这样一 个Ruby类:

ruby 代码

classTestdefteststr=”str”str.concat(”ing”)endend

对应的c语言代码就是:

cpp 代码

#include
#include”ruby.h”staticVALUEt_test(VALUEself){
VALUEstr;str=rb_str_new2(”str”);
printf(”beforeconcat:str:%p,
str.aux.shared:%p,str.ptr:%s”n”,str,(RSTRING(str)->aux).shared,RSTRING(str)->ptr);
rb_str_cat2(str,”ing”);
printf(”afterconcat:str:%p,str.aux.shared:%p,str.ptr:%s”n”,
str,(RSTRING(str)->aux).shared,RSTRING(str)->ptr);returnself;
}
VALUEcTest;
voidInit_string_hack(){
cTest=rb_define_class(”Test”,rb_cObject);
rb_define_method(cTest,”test”,t_test,0);
}//string_hack.c

rb_define_class函数定义了一个类Test,rb_define_method将t_test方法以test的名称添加到Test类。在 t_test中,通过rb_str_new2每次生成一个RString结构,然后通过rb_str_cat2将str与”ing”连接起来,添加了一些 打印用于跟踪。利用mkmf产生Makefile,写一个extconf.rb

ruby 代码

require’mkmf’create_makefile(”string_hack”);

执行ruby extconf.rb,将产生一个Makefile,执行make,生成一个string_hack.so的链接库。扩展写完了,通过ruby调用:

ruby 代码

require’string_hack”t=Test.new(1..3).each{|i|t.test}

输出:

before concat: str:0×40098a40, str.aux.shared:0×3, str.ptr:str
after concat: str:0×40098a40, str.aux.shared:0×8, str.ptr:string
before concat: str:0×40098a2c, str.aux.shared:0×3, str.ptr:str
after concat: str:0×40098a2c, str.aux.shared:0×8, str.ptr:string
before concat: str:0×40098a18, str.aux.shared:0×3, str.ptr:str
after concat: str:0×40098a18, str.aux.shared:0×8, str.ptr:string

从结果可以看出,在str concat之前之后,str指向的位置没有改变,改变的仅仅是str中ptr指向的字符串的值,看看rb_str_cat2函数的实现就一目了然了:

cpp 代码

VALUErb_str_cat(str,ptr,len)VALUEstr;
constchar*ptr;
longlen;
{
if(len<0){rb_raise(rb_eArgError,”negativestringsize(orsizetoobig)”);
}
if(FL_TEST(str,STR_ASSOC))
{
rb_str_modify(str);
REALLOC_N(RSTRING(str)->ptr,char,RSTRING(str)->len+len);
memcpy(RSTRING(str)->ptr+RSTRING(str)->len,ptr,len);
RSTRING(str)->len+=len;
RSTRING(str)->ptr[RSTRING(str)->len]=’”0′;
/*sentinel*/
returnstr;
}
returnrb_str_buf_cat(str,ptr,len);
}
VALUErb_str_cat2(str,ptr)VALUEstr;
constchar*ptr;
{
returnrb_str_cat(str,ptr,strlen(ptr));
}
//string.c

北京网站制作公司

ruby

我爱 Ruby 的三十七个理由

Tags:

这里我就不累述 Ruby 语言的历史了。如果您还不了解 Ruby,官方网站 www.ruby-lang.org 是最好的去处。而对于已经了解 Ruby 的各位,我在此给出我爱上这门(相对比较)新的语言的理由。

  1. Ruby 是面向对象语言。 这意味着什么呢?的确,关于“什么是 OOP”,每十位程序员当中恐怕就有十二种看法。这个问题我留待您自己判断。而就特征而言,Ruby 提供了机制,将数据和方法封装到对象里,实现了一个类到另一个类的继承机制,还提供对象多态机制。与某些语言(C++、Perl 5 等等)不同的是,Ruby 从一开始的时候就是以面向对象为目标来设计的。
  2. Ruby 是“纯正”的 OOP 语言。 我说重复了么?我可不这么认为。说“纯正”, 这就意味着,所有的一切——包括字符串或整型之类的基本数据类型——都是以对象的形态来表达的。在 Ruby 中用不着 Java 里面提供的那种 wrapper class(包裹类)(译注:wrapper class 用来将基本类型包装成对象类型)。而且,甚至连常量都被当作对象来对待,因此方法可以由——比如数字常量——来唤起。
  3. Ruby 是动态语言。 对于只熟悉诸如 C++、Java 等静态语言的人而言,这就是个新概念。所谓动态意味着,可以在运行期动态地追加或者重新定义方法和变量。这种动态机制免除了对 C 语言中条件编译(#ifdef) 这类功能的需要,并且使构建复杂的 reflection(内省机制)API 成为可能。复杂的 reflection 机制又进而使得程序可以变得更为“自知(self-aware)”——从而为如下诸多功能开启了方便之门:运行期类型信息、丢失方法的侦测、能够侦测新追 加的方法的钩子技术,等等。从这个方面来看,Ruby 与 Lisp 和 Smalltalk 有些许亲缘关系。
  4. Ruby 是解释型语言。 这是个复杂问题,值得 多说几句。有人可以争论说,从性能方面来考量,语言采用解释型机制弊大于利。对于这种想法,我用下面的斟酌予以回应:1. 首先最为显著的是,快速开发周期(rapid development cycle)颇有效益可得,Ruby 的解释型语言本质助长这种效益。2. 太慢到底是多慢呢?说慢之前请先做一些性能测试。3. 尽管会有人因此而批评我,但我还是要这么说:处理器每年都在持续提速。4. 如果您着实需要速度,您可以用 C 语言撰写需要速度的那部分代码。5. 最后,从某种意义上说,有一种值得商榷的观点:鉴于没有哪种语言是从骨子里就被解释,因此并不能说不可能撰写出 Ruby 编译器。
  5. Ruby 能够处理正则表达式。 多年以来,正则表达式一直被认为是属于 UNIX 领域的雕虫小技,涉及诸如 grepsed 之类的阳春工具,或是在 vi 里面做一些讨巧的“查找-替换”操作。Perl 语言帮助人们改变了这种看法,而现在 Ruby 也对此有所帮助。越来越多的人认识到这种超高级的字符串和文本操纵技巧中所蕴含的无比威力。对此持怀疑态度者,应该去读一读 Jeffrey Friedl 的书 Mastering Regular Expressions 。非怀疑论者也应该读。
  6. Ruby 是支持多种平台的语言。 Ruby 可以运行在 Linux 及其他 UNIX 变体、各种版本 Windows 平台、BeOS,甚至 MS-DOS 上。如果我没记错的话,还有 Amiga 版本的。
  7. Ruby 借鉴了前辈语言。 这是好事儿吗?在文 学领域之外,是的,这是好事儿。牛顿说,“若我看得比别人远,乃是因为我站在了巨人的肩上”。Ruby 确实是站在了巨人的肩上。Ruby 引借了来自 Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell,以及其他语言的特性。我看到其中的原则是:1. 不要重新发明轮子;2. 不要修补没有问题的部分;3. 特别重要的是,充分利用人们现有的知识。您掌握 UNIX 里面的文件和管道(pipes)吗?没问题,您可以在 Ruby 中运用到那些知识。您花了两年时间研习 printf 的各种格式符号?别担心,您在 Ruby 里面还可以使用 printf。您了解 Perl 的 regex handling 技术?好的,那么您几乎也就立刻学会了 Ruby 的 regex handling 技术。
  8. Ruby 具创新性。 这一条与第7条有些矛盾 吧?唔……是有一点;每个硬币都有两面嘛。Ruby 有一些特征极具创新性,比如非常有用的 mix-in 概念。或许这些创新型特征将来会被新的语言借鉴。(注:一位读者向我指出,LISP 至少早在 1979 年就有 mix-in 了。这一点我倒是完全没有注意到;我当另寻一个更好的例证,保证其真确性。)
  9. Ruby 是特高级语言(Very High-Level Language,VHLL)。 这 个问题有待商榷,因为术语 VHLL 还未被广泛使用,而其含义更是比 OOP 的含义更具争议性。我说“特高级”指的是,Ruby 可以通过相对较少的指令掌控复杂的数据结构并对其进行复杂的操作,符合了被一些人称为“最少投入”的原则(Principle of Least Effort)。
  10. Ruby 有智能垃圾收集器。 诸如 mallocfree 之类的函数现在只是已然过去的昨夜噩梦。您连析构函数都不需要调用。仅此足矣。
  11. Ruby 是脚本语言。 不要以为 Ruby 是脚本语言所以就不强大。Ruby 可不是玩具。Ruby 是全功能的程序设计语言,只不过 Ruby 让传统的脚本操作变得更容易撰写,比如运行外部程序、检查系统资源、使用 pipe(管道)、截获输出等等。
  12. Ruby 用处多样。 Ruby 可以完成好 Kornshell 能够完成好的事情,也可以完成好 C 语言能够完成好的事情。想快速写一个十行的 hack 程序来完成一次性的任务,或者为遗留代码写个 wrapper 吗?用 Ruby 没问题。想写一个 Web 服务器、CGI,或者棋类游戏吗?用 Ruby 也没问题。
  13. Ruby 对线程予以支持。 您可以使用简单的 API 撰写多线程应用程序。是的,即使是在 MS-DOS 上撰写也可以。
  14. Ruby 是开源的。 想看 Ruby 的源代码了?想提供一个补丁建议了?只管去吧!想与智慧云集、乐于助人、包括语言设计者在内的用户社区进行联络吗?可以的!
  15. Ruby 具有直观性(直觉性)。 学习曲线平滑 不陡。一旦入了门,您是否就开始“猜测” Ruby 的使用方式了呢?您的猜测通常是正确的(译注:因为 Ruby 很直观,符合了人们惯常期待的方式)。Ruby 致力于符合“最少诧异或惊讶”之原则(Principle of Least Astonishment (or Surprise)).
  16. Ruby 具有异常(exception)机制。 同 Java 和 C++ 一样,Ruby 能处理异常。这意味着少与返回代码纠缠,更少的嵌套 if 语句,更少的意大利面式逻辑(spaghetti logic,贬义,指的是复杂混乱的代码设计,比如大量使用GOTO语句等等),更好的错误处理机能。
  17. Ruby 有高级的 Array class 。 数 组是动态的;您不必像在 Pascal 等语言当中那样在编译期声明数组大小。您不必像在 C/C++/Java 当中那样为数组分配内存空间。Ruby 的数组是对象,因此您不必时刻警惕其长度;原则上,您不可能像在 C 语言当中那样“越出数组的长度大限”。想以索引、元素,或者反向处理数组吗?想打印整个数组吗?Ruby 为所有这些事情提供了对应的方法。想把数组当作集合(set)、堆栈(stack),或队列(queue)来对待吗?Ruby 也为此提供了对应的方法。想把数组当作查找表(lookup table)来使用吗?这是个问题问得巧——您不必这样用,因为 Ruby 提供了哈希表专门处理这个问题。
  18. Ruby 是可扩展的。 您可以用 Ruby 或者 C 语言编写外部程序库。另外,您还可以随心所欲地就地修改现存的类和对象。
  19. Ruby 鼓励 literate programming(字面编程方式)。 您可以将注释嵌入到代码中,Ruby 的文档工具可以从中抽取和操纵这些注释。(Literate programming 的铁杆儿支持者或许会认为这是很基础的东西吧。)
  20. Ruby 以创新的方式使用分隔符和大小写。 返回 Boolean(尽管 Ruby 不这样称呼它)的方法通常都以问号结尾,而且,修改数据的方法的名称带有惊叹号。一切都简单、明了、直观。包括 class 名称在内的所有常量都以大写字母开头。所有对象的 attributes 都以 @ 标记开头。这种方案既有老式的“匈牙利表示法(Hungarian notation)”的务实性,又避免了龌龊刺眼的表现形式。
  21. Ruby 的保留字不保留。 使用被称为“保留字(reserved word)”的标识符是完全没有问题的,只要保证别让语法分析器遇到歧义的情况就行。这可真是畅快。
  22. Ruby 支持迭代器(iterator)。 Ruby 的迭代器使得“传递代码区块到对象中”这种操作可以经由这样的方式来完成,即对于数组、列表(list)、树(tree)等诸多结构中的每一个元素都能够调用指定的代码区块。这是个值得深入探究,威力强大的技巧。
  23. Ruby 具有安全性特性。Ruby 借用了 Perl 的“点缀(tainting)”概念,通过 $SAFE 变量实现了多种控制级别(揪心级别?)。此特性对于“为了攻破 web 服务器而被利用”的 CGI 程序而言,特别有好处。
  24. Ruby 没有指针。 类似 Java,并向 C++ 恶狠狠地点了点头,Ruby 中没有“指针(pointer)”概念;不存在间接性,没有指针运算,没有语法和调试指针所带来的头疼困扰。当然,这意味着真正底层的系统编程变得困难了 一些,比如访问某设备的控制状态寄存器;但这些系统级事务总是可以利用 C 程序库来完成。(正如 C 程序员会在必要时使用汇编一样,Ruby 程序员会在必要时使用 C 语言!)
  25. Ruby 关注细节。 Ruby 提供丰富的同义词和别名。不记得对数组或字符串是用 size 还是 length 吗?两个都可以用。对于范围(range),是用 beginend ,还是 firstlast?由您自选。您心里拼写 indices ,而您的手却拼出 indexes 吗?两个都可以用。
  26. Ruby 具有灵活的语法特性。 在方法调用中可以忽略括号,参数之间可以忽略逗号。Perl 风格的引号允许我们定义数组或字符串时不必劳烦去敲那些引号和逗号(译注:Ruby 中 a = [ 'ant', 'bee', 'cat' ] 可以简写为 a = %w{ ant bee cat })。return 关键字也可以忽略。
  27. Ruby 有丰富的程序库可供使用。 Ruby 的程序库提供了对线程、套接字(socket)、有限的对象永续机制、CGI、服务器端可执行机制、DB 文件等许多功能的支持。Ruby 还对 Tk 有所支持,今后会有更多的支持。
  28. Ruby 有调试器(debugger)。 在完美世界里我们大约不需要调试器。可惜这并不是完美的世界。
  29. Ruby 可通过交互的方式来使用。 Ruby 设计为可以将其当作一种类似 Kornshell 的 shell 来使用。(这是本文中最令人质疑的观点,而且我也不得不承认,Ruby 并不是真正非常优秀的 shell。但我还是坚持认为,基于 Ruby 的 shell 是个不错的东西。)
  30. Ruby 是精炼的语言。 Ruby 中没有非必要的关键字,比如 Pascal 的 beginif 之后的 thenwhile 之后的 do。不需要事先声明变量,因为变量无类型。不需要为方法指定返回类型。不需要 return 关键字;方法会返回最后被求值的表达式之结果。另外一方面……Ruby 不像 C 或 Perl 那么晦涩。
  31. Ruby 是面向表达的语言(expression-oriented)。 您可以像说话一样很容易写出 x = if a<0 then b else c end 这样的句子。
  32. Ruby 语言中系结了 syntax sugar(语法糖)。 (转述 Mary Poppins 的话说就是:一勺语法糖可以压一压语义的药味。”A spoonful of syntax sugar helps the semantic medicine go down.”)只要您想,您就可以用 for a in x 来迭代遍历数组 x,可以用 a += b 来代替 a = a + b。大多数操作符其实只是简化的方法表示、更加直觉的名称以及更加方便使用的语法形式。

    译注:Mary Poppins 指的是美国1964年拍摄的经典电影《欢乐满人间(Mary Poppins)》。

  33. Ruby 支持操作符重载(overloading)。 如 果我没记错的话,操作符重载源起自很久以前的 SNOBOL,但却是由较近的 C++ 振兴。这个机制可能会被滥用或误用,但有总比没有好。另外,Ruby 会自动定义操作符的赋值(assignment)版本,比如说,您定义了操作符 + ,那么您就会自动得到操作符 +=
  34. Ruby 具有无限精度的整数算法 谁还关心 shortintlong 呢? 使用 Bignum 就行了。承认吧,您总还是想看看365的阶乘是多少。现在您可以看了。
  35. Ruby 具有幂运算操作符。 在过去年代,我们 在 BASIC 和 FORTRAN 里使用过幂运算操作符。但是后来我们学会了 Pascal 和 C 语言,知道了这个操作符邪恶的一面。(我们被告知,我们甚至都不曾知道求值是如何完成的——是使用了对数还是迭代?效率有多高?)可是我们真的关心这些 么?如果是,我们可以编写自己的版本。如果不是,Ruby 还提供了您珍爱的老好用的 ** operator 供您使用。享用它吧!
  36. Ruby 具有强大的字符串处理能力。 如果您想对字符串进行搜索、替换、修改、格式化、截断(trim)、分隔(delimit)、追加(interpose),或者字元化(tokenize)等操作,您可以使用 Ruby 内建的方法。如过内建方法不能满足要求,您可以利用内建方法来建构自己所需。
  37. Ruby 几乎没有违反自身规则的例外情况。 Ruby 的语法和语义比大多数语言更具自我完备性(self-consistent)。每种语言都有犄角旮旯,每种规则都有例外情况;但 Ruby 的旮旯和例外可能比您想象的要少。

北京网站制作公司

php

2009/12/08

Ruby on Rails成为运行在微软云计算上最新开源产品

Tags:

有一段时间,微软一直在拉拢开源软件厂商说服他们在windows提供开源软件。在大部分相同的应用程序出现在windows Azure云计算平台上时也不会为此感到惊奇。

截至11月底,微软架构师Simon Davies在博客中说他已经得到了运行在windows Azure上的开源框架Ruby on Rails。通过11月对Windows Azure软件开发工具包(SDK)的新功能结合的使用,加上一些新的解决方案加速器技术,Davies说他争取让Ruby on Rails尽快运行。

Davies的博客:

这些(新11月的SDK)功能之一,就是使Worker Roles同时接收使用HTTP,HTTPS和TCP的外部和内部网络通信终端的网络信息流通量。这项新功能可以应对很多新的情况,其中一个则是根据windows Azure上接受到的信息运行已存在的应用程序。

windows Azure平台的网站有很多Azure加速器解决方案,还有一些微软最近推出的新的软件开发工具包:Java的AppFabric中间件,Ruby和PHP开发,并提供了下载。

Davies指出,微软已经参与了一些开源应用程序,包括MySQL,Mediawiki,Memcached和Tomcat,可以在Windows Azure上运行的。微软一直致力于提供用于Windows Azure的PHP和Eclipse工具 。

最近,CNET开源博客Matt Asay表示有点担心微软对开源应用程序的超级友好,危险的拥抱 -特别是在云领域-很有可能弊大于利。

有些开源厂商- SugarCRM -开发他们自己的Azure端口。但另一方面,微软是事件主体,无论是从Azure中移除开源应用程序和工具或者与第三方合作,都是这样。

目前没有看到Asay所说的潜在危险,使用Azure的不论是开发人员和客户在意的是谁在托管Azure而不是谁将这些应用程序放在云上。你是否同意?

北京网站建设公司

产业新闻, 开源动态

2009/10/16

Ruby 发布 Ruby 1.8.7

Tags:

Phusion发布了新的Ruby Enterprise Edition,版本号为1.8.7-20090928。之前的版本都基于Ruby 1.8.6,该版本开始基于Ruby 1.8.7。Ruby 1.8.7发布已经有段时间了,为什么现在才切换到1.8.7呢?Phusion在发布声明中解释了这个问题:

我 们起先并不愿意切换到1.8.7:很多人报告说在引入1.8.7后遇到了各种不兼容的情况,而且其他几个Ruby实现都抵制 1.8.7。然而,现在的情况不同了。Rails 3.0将不再支持Ruby 1.8.7之前的版本,JRuby最近也决定支持1.8.7,并且OS X Snow Leopard和所有Linux发行版都自带了1.8.7。我们已经收到了来自社区的很多请求,希望能有一个基于1.8.7的版本。

本次发布还有一些其他的消息——新版本集成了Brent Roman的MBARI补丁,它能改善性能、减少内存开销。为了提升多线程速度,该版本中还包含了一个作为可选实验特性的补丁(作者是Joe Damato和Aman Gupta)

这些补丁究竟起了多少改善作用呢?Twitter对该版本做了测试,正如Evan Weaver报告的那样,它在吞吐量上带来了显著的提升。Evan还补充道“比起-O2或-O3(针对速度优化),用-Os(针对大小优化)编译的Ruby更快一些。Phusion的Hongli指出Ruby的指令局部性很糟,主要是靠将指令塞进指令缓存中来改善性能的”。

InfoQ向Ruby Enterprise Edition团队咨询了在升级到新版本时是否存在一些问题。Phusion的Ninh Bui回答道:

呃,除了从1.8.6到1.8.7的兼容性问题,tcmalloc——我们使用的内存分配器——在Snow Leopard上还无法正常工作

Ninh的同事Hongli还补充说:

目前Xen的支持方面还存在一些问题:有报告说REE在Xen中运行时输出了很多(无害的)警告信息。我们计划在以后的版本中加 入Xen特有的编译标志来解决这个问题。至于1.8.6和1.8.7的不兼容性,这是由语义变化造成的,例如,一些方法现在不再返回Array,改为返回 Enumerable;一些标准库类有细微变化,等等。

社区已经接受了这些变化,因此我并不认为会有不兼容的问题。

您可在www.rubyenterpriseedition.com获取到Ruby Enterprise Edition的新版本。

查看英文原文:New Ruby Enterprise Edition Release Switches to Ruby 1.8.7