Ruby,一种为简单快捷面向对象编程(面向对象程序设计)而创的脚本语言,由日本人松本行弘(まつもとゆきひろ,英译:Yukihiro Matsumoto,外号matz)开发,遵守GPL协议和Ruby License。Ruby的作者认为Ruby > (Smalltalk + Perl) / 2,表示Ruby是一个语法像Smalltalk一样完全面向对象、脚本执行、又有Perl强大的文字处理功能的编程语言。其他特色包括:
§ 运算符重载
§ 自动垃圾回收
§ 弱类型(动态类型 | 标量变量)
§ 变量无需声明 (不必事先宣告变量)
§ 在Windows上,加载DLL
§ 巨大的标准库(函式库;Library)
介绍
历史
Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。之所以称为Ruby,是因为Perl的发音与6月的诞生石pearl(珍珠)相同,因此Ruby以7月的诞生石ruby(红宝石)命名。
Ruby明显比其他类似的编程语言(如Perl或Python)年轻,又因为Ruby是日本人发明的,所以早期的非日文资料和程序都比较贫乏,所以现在在网上仍然可以找到Ruby的资料太少之类的批评。约于2000年,Ruby开始进入美国,英文的资料开始发展。
Ruby现在的稳定版本是1.8.6(2007年3月12日发布)。
Ruby 的理念
减少编程时候的不必要的琐碎时间,令编写程序的人高兴,是设计 Ruby 语言的 Matz 的一个首要的考虑;其次是良好的界面设计。他强调系统设计必须强调人性化,而不是一味从机器的角度设想。
人们特别是电脑工程师们,常常从机器着想。他们认为:“这样做,机器就能运行的更快;这样做,机器运行效率更高;这样做,机器就会怎样怎样怎样。”实际上,我们需要从人的角度考虑问题,人们怎样编写程序或者怎样使用机器上应用程序。我们是主人,他们是仆人。
遵循上述的理念,Ruby 语言通常非常直观,按照编程人认为它应该的方式运行。
Semantics
Ruby 是完全面向对象的:任何一点数据都是对象,包括在其他语言中的基本类型(比如:整数,布尔逻辑值),每个过程或函数都是方法。
Ruby的Hello World程序
下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:
#!/usr/bin/env ruby
puts"Hello, world!"
Ruby 的特点
§ 完全面向对象
在Ruby语言中,任何东西都是对象,包括其他语言中的基本数据类型,比如整数
§ 变量没有类型
Ruby的变量可以保有任何类型的数据。
§ 任何东西都有值
不管是数学或者逻辑表达式还是一个语句,都有值
§ 变量命名规则
Ruby的变量有以下几种:
§ 一般小写字母、底线开头:变量 (Variable)
§ $开头:全局变量 (Globalvariable)
§ @开头:实体变量, 实例变量 (Instance variable)
§ @@开头:类别变量, 类变量 (Class variable)
§ 大写字母开头:常数 (Constant)
§ 已经定义的类可以在运行时修改
Ruby是动态语言,你可以在程序中修改先前定义过的类。也可以在某个类的实例中定义该实例特有的方法,这叫做单立方法。
classMyClass
def the_method
"general method"
end
end
mc = MyClass.new
def mc.the_method
"special for this instance."
end
mc.the_method
用Ruby来写程序
§ Ruby入门
§ 字符串处理
JRuby
JRuby,类似Python的Jython,一个可于Java上执行Ruby的语言,支援Java的接口和类别。最新发布版为0.9.8(2007-3-6),与Ruby 1.8.4兼容。它的官方网站为jruby.codehaus.org。
参见
§ Python(经常和Ruby比较)
§ Perl
§ Smalltalk
§ Ruby on Rails:一个MVC的快速网站开发应用框架。
Ruby/字符串处理
创建字符串
在Ruby中创建一个字符串有多种方式。可以有两种方式表示一个字符串:用一对单引号包围字符('str')或用一对双引号包围字符("str")
这两种形式的区别在于对于包围的字符串的处理,用双引号构造的字符串能处理更多的转移字符。
除了这两种方式,ruby还支持3种方式去构建字符串:%q、%Q和here documents。
§ %q后面用一对分界符包围的字符可以构造单引号字符串。
§ %Q后面用一对分界符包围的字符可以构造双引号字符串。
PS:分界符可以是任何一个非字母数字的单字节字符,如() [] {} <> //。
§ here documents
str=<<END_OF_STRING
a string
END_OF_STRING
ruby中并不会去掉字符串开头的空格。
#5种构建字符串hello world的方法对比
'hello world'
"hello world"
%q/hello world/
%Q{hello world}
str=<<EOS
hello world
EOS
属性
长度
使用length函数
例s:='abc123',其长度为6
输入i:=length(s);
则输出i:=6;
解析失败 (PNG 转换失败;检查正确安装的 latex 和 dvipng (或 dvips + gs + convert)): 插入数学公式 ==常用操作==
删除
str.delete(str1,str2,...)
#删除参数交集出现的所有字符,返回一个新字符串,如:
"hello world".delete("l")#返回"heo word"
"hello world".delete("lo","o")#返回"hell wrld"
str.delete!(str1,str2,...)
#直接对str进行删除操作,同时返回str如:
str="helloworld"
str2=str.delete("l") #str为"helloworld",str2为"heo word"
str.delete!("l")#str为"heo word"
#用正则,直接对str进行删除操作,同时返回str如:
str="helloworld"
str2=str.gsub(/1/,"") #str为"helloworld",str2为"heo word"
str.gsub!(/1/,'')#str为"heo word"
查找
pos(s1,s2)
函数,其功能是在s2串中查找是否有s1子串,如果有则返回s1在s2中的起始位置,否则返回值为0。如y:=pos(‘abc’,’123abacbcabcabcabc’);则整数变量y的值为10,而y:=pos(‘abc’,’qawsasd’);则y的值为0。
比较
字符串可以进行下列六种关系运算:>、<、=、>=、<=、<>。
在关系比较时,无论比较的两个字符串长度是否相同,从左到右按照它们的ASCII码值逐一进行比较。
当两个字符的ASCII值不等时,便可比较出大小。若短字符串和长字符串的左边字符都相等时,长串比短串值大。如:‘abcde’>‘abc’为true;‘abcde’<‘aefgh’为true。
连接字符串
concat(s1,s2,……,sn)
函数,作用是把n个字符串按序连接起来构成一个新的字符串。如s:=concat(‘abcd’,’efg’,’hijklmn’);则结果为’abcdefghijklmn’。
求字串
大小写转换
strtolower()将传入的字符串全部转换为小写,并返回转换后的字符串,该函数的格式如下:
String strtolower(str $str)
参数$str为要转换的字符串,将字符串中所有字符转换为小写。
strtoupper()则是小写转换为大写,格式与上相同。
转换成数字
将数value转化成数字串st。如果value是实数,则系统会先把value转换成浮点数形式,然后再转换成字符串给st。如str(123,s),则s=‘123’;如str(123.456,s),则s=‘1.2345600000E+02’。
val(st,value,code)
过程,将数字串st转化为数value,code用来表示转换是否成功,转换成功则为0,否则code返回检测出错的第一个字符位置,且value的值也为0。如val(‘123abc’,s,t);则t=4,s=0;如val(‘123’,s,t),则t=0,s=123。
特殊字符处理
str.chop
#删除字符串str的最后一个字符,并返回新字符串
#若字符串以\r\n结尾,则两个字符都删去
#若字符串为空串,则返回空串
"string\r\n".chop #返回"string"
"string\n\r".chop #返回"string\n"
"string".chop #返回"strin"
"s".chop.chop #返回""
str.chop!
str.chomp(endstr)
#删除str的后缀endstr
#如果未指定endstr,则删除回车换行符(\r、\n和\r\n)
"hello\r\n".chomp #返回"hello"
"hello".chomp("lo")#返回"hel"
"hello".chomp("l")#返回"hello"
str.chomp!