Ruby 初学

来源:互联网 发布:增量式pid算法 编辑:程序博客网 时间:2024/06/05 11:01

Ruby,一种为简单快捷面向对象编程(面向对象程序设计)而创的脚本语言,由日本人松本行弘(まつもとゆきひろ,英译:Yukihiro Matsumoto,外号matz)开发,遵守GPL协议和Ruby LicenseRuby的作者认为Ruby > (Smalltalk + Perl) / 2,表示Ruby是一个语法像Smalltalk一样完全面向对象脚本执行、又有Perl强大的文字处理功能的编程语言。其他特色包括:

§  运算符重载

§  自动垃圾回收

§  弱类型(动态类型 |标量变量)

§  变量无需声明 (不必事先宣告变量)

§  Windows上,加载DLL

§  巨大的标准(函式库;Library)

 

 

介绍

历史

Ruby的作者于1993224日开始编写Ruby,直至199512月才正式公开发布于fj(新闻组)。之所以称为Ruby,是因为Perl的发音与6月的诞生石pearl(珍珠)相同,因此Ruby7月的诞生石ruby(红宝石)命名。

Ruby明显比其他类似的编程语言(如PerlPython)年轻,又因为Ruby是日本人发明的,所以早期的非日文资料和程序都比较贫乏,所以现在在网上仍然可以找到Ruby的资料太少之类的批评。约于2000年,Ruby开始进入美国,英文的资料开始发展。

Ruby现在的稳定版本是1.8.62007312日发布)。

Ruby 的理念

减少编程时候的不必要的琐碎时间,令编写程序的人高兴,是设计 Ruby语言的 Matz 的一个首要的考虑;其次是良好的界面设计。他强调系统设计必须强调人性化,而不是一味从机器的角度设想。

人们特别是电脑工程师们,常常从机器着想。他们认为:这样做,机器就能运行的更快;这样做,机器运行效率更高;这样做,机器就会怎样怎样怎样。实际上,我们需要从人的角度考虑问题,人们怎样编写程序或者怎样使用机器上应用程序。我们是主人,他们是仆人。

遵循上述的理念,Ruby语言通常非常直观,按照编程人认为它应该的方式运行。

Semantics

Ruby 是完全面向对象的:任何一点数据都是对象,包括在其他语言中的基本类型(比如:整数,布尔逻辑值),每个过程函数都是方法

RubyHello 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,类似PythonJython,一个可于Java上执行Ruby的语言,支援Java的接口和类别。最新发布版为0.9.82007-3-6),与Ruby 1.8.4兼容。它的官方网站为jruby.codehaus.org

参见

§  Python(经常和Ruby比较)

§  Perl

§  Smalltalk

§  Ruby on Rails:一个MVC的快速网站开发应用框架。

 

 

 

 

Ruby/字符串处理

创建字符串

Ruby中创建一个字符串有多种方式。可以有两种方式表示一个字符串:用一对单引号包围字符('str')或用一对双引号包围字符("str")

这两种形式的区别在于对于包围的字符串的处理,用双引号构造的字符串能处理更多的转移字符

除了这两种方式,ruby还支持3种方式去构建字符串:%q%Qhere 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.chompendstr)

#删除str的后缀endstr

#如果未指定endstr,则删除回车换行符(\r、\n和\r\n)

"hello\r\n".chomp #返回"hello"

"hello".chomp("lo")#返回"hel"

"hello".chomp("l")#返回"hello"

str.chomp!