??xml version="1.0" encoding="utf-8" standalone="yes"?>
Ruby支持单ѝ然而,它还提供了mixin-它提供了多承的许多特征。一个mixin是一U?模块"cd。ؓ此,你必首先理解在Ruby中模块的含义?/font>
在Ruby中,模块是一U把Ҏ和常数分l的方式。它与类怼Q但是一个模块没有实例ƈ且也没有子类。也许解释模块的最好方法是举一个例子。假定你正在开发一个制造业应用E序。该E序需要存取大量的U学公式和常敎ͼ那么你可以或者是创徏一个通用cL把这些放在其中或者是创徏一个模块。模块的优点在于Q在存取其中的公式时Q根本没有Q何实例扰乱所带来的烦恹{?
现在Q这些公式方法和常数可以被Q何数目的其它cL其自w所使用Q?/font>
除了作ؓҎ和常数的"公共"应用以外Q模块还可以帮助定义多重l承。一个mixin是一个简单的"包括"有一个类定义的模块。当一个类包括一个模块时Q所有的模块中的Ҏ和常数都成ؓcȝ实例Ҏ和常数。例如,假定上面定义的Formula模块作ؓ一个mixin被添加到RectanglecRؓ此,你要使用"include"关键字:
现在QRectangle的实例具有了它们可以使用的force和energyҎQƈ且Rectanglec能够访问常数ACCELERATION和LIGHTSPEEDQ?/p> q意味着QmixinlRuby中的cd来了许多多重l承的优点,却避开了多重承中存在的问题?/p> 十一?控制?/strong> 象所有的E序语言一PRuby提供了一l控制流命oQ这包括条g语句(if/elsel构)Qcase语句和@环语?doQwhile和for)Q还提供了象Ada和Java{语a中的异常处理能力。下面是Ruby中的一些控制流语句的示例: Z在你的代码中引发一个异常,你只需要简单地调用raiseҎQ?/p> W一个raise调用创徏一个RuntimeError。第二个raise创徏一个显CZ条消息的RuntimeError。最后一个raise调用一个TooBigException的新实例Q由它创Z个粗略定义的错误Q,q设|它的适当消息?/p> 一个Ruby程?/strong> Z帮助你更好地掌握Ruby的基知识Q我在本文中提供了一个小E序供你学习之用。ؓ了ɘq个E序工作Q你可以下蝲q把该文件解压到你的文gpȝ。之后,它将创徏一个examples文g夹,在这个目录下共有9个Ruby代码文gQ?rb文gQ。本文中的代码就包含在这些文件中。另外,你会扑ֈ一个testShapes.rb文gQ它是测试Ruby的RectangleQSquare和Circle对象的主文g。只需单地打开一个命令提C符q运行testShapes.rb文g卛_?/p> 你将注意刎ͼ在testShapes.rb和另外一些代码中Q文件以"require"再加上一个文件名开_象rectangle.rbQ。这是在你的RubyE序中加入或使用来自于其它文件代码的Ruby标志?/p> ȝ Ruby能否接管Java或C#而成Z界领先的C软g开发语aQ尽Ruby可能变得十分行Q但我对此仍抱有怀疑态度。作Z名在业界摸爬滚打多年的专业h员,我对其偶然性ƈ不感到惊Ӟ但我q是比较注重实效的。例如,我发现Smalltalk是一U比Java优越的高U语aQ然而优ƈ不会M赢。现代语a背后d在大量的技术和市场斚w的支持。库Q开发工具包Q框Ӟ架构Q连接器Q适配器,支持q_Q服务,知识库,能干的开发团队,{等Q都会被配置C以支持象Javaq样的程序语a。ƈ且,无论你喜Ƣ与否,Sun和Microsoftd下的市场在未来一D|间内肯定q是开发环境的胜者?/p> 那么Qؓ什么还要探讨Ruby呢?作ؓ一UPerl或Python脚本语言的代替(q正是它的最初目的)或快速原型开发工PRuby可能特别有用。一些h也已l看CRuby的威力,q且开始把Ruby作ؓ一U伟大的Ҏq行~程教学。根据我的本地Ruby用户l的成员提供的信息,有一些h正在把它应用于测试生产系l。不仅如此,我将邀请你Q就象Bruce Tate和Dave Thomas邀h一h探讨一下这U语a的力量和丽之处。即使Ruby不会得到q泛使用Q但是随着Z对它的逐渐认识和试用,它一定会扑ֈ适应自己的编E环境?
q些关键字被插入在两个方法之间的代码中。所有从private关键字开始定义的Ҏ都是U有的,直到代码中出现另一个存取控制关键字为止。例如,在下面的代码中,accessor和areaҎ默认情况下都是公qQ而growҎ是私有的。注意,在此doubleSizeҎ被显式指定ؓ公共的。一个类的initializeҎ自动为私有的?/font>
如下所C,doubleSize可以在对象上执行Q但是Q何对grow的直接调用都被拒lƈ且返回一个错误?/font>
默认情况下,在Ruby中,实例和类变量都是U有的,除非提供了属性accessor和mutator?
module Formulas
ACCELERATION = 9.8
LIGHTSPEED = 299792458
def energy (mass)
mass*(LIGHTSPEED**2)
end
def force (mass)
mass*ACCELERATION
end
end
irb(main):046:0> Formulas.force(10)
=> 98.0
irb(main):047:0≫ Formulas::ACCELERATION
=≫ 9.8
注意Qؓ了调用一个模块方法或使用一个模块常敎ͼ你必M用类g调用一个类Ҏ的标志。ؓ了调用一个模块方法,你需要用模块类名,后面跟着一个点Q再跟着模块Ҏ名。ؓ了引用模块常敎ͼ你可以用模块名Q后面跟着两个冒号Q再跟着常数名?/p>
class Rectangle
include Formulas
endirb(main):044:0> class Rectangle
irb(main):045:1> include Formulas
irb(main):046:1> end
=> Rectangle
irb(main):047:0> Rectangle.new(4Q?).force(10)
=> 98.0
irb(main):048:0> Rectangle::LIGHTSPEED
=> 299792458 ifarea > 100
"big"
else
"small"
end
case height
| when 1
| print "stubby\n"
| when 2..10 #高度范围??0
| print "short\n"
| when 10..20 #高度范围??0
| print "tall\n"
| end
aRect = Rectangle.new(4Q?)
while aRect.area < 100 and aRect.height < 10
aRect.doubleSize()
end
for element in [2Q?.8Q?some string"Q Math::PI] #遍历对象集合
print "The type is: " + element.type.to_s + "\n&"
end
控制语句通常非常直接Q但是如前面的case语句和for循环语句所昄的,Ruby借鉴了其它一些语a特征和普通的面向对象的特性?br />异常处理cM于Java中的"try...catch...finally"语句。在Ruby中,它们更改?begin...rescue...ensure"语句Q?/p>begin
#实现一些事?
rescue
##处理错误
ensure
#做一些清理工作,如关闭一个打开的文件等
end if area < 0
raise
else if area > 0 and area < 10
raise "Rectangle too small"
else if area > 100
raise TooBigException "Rectangle too big"
end
]]>
class Rectangle
attr_accessor :heightQ?width
def initialize (hgtQ wdth)
@height = hgt
@width = wdth
end
def area ()
@height*@width
end
private #开始定义私有方?
def grow (heightMultipleQ widthMultiple)
@height = @height * heightMultiple
@width = @width * widthMultiple
return "New area:" + area().to_s
end
public #再次定义公共Ҏ
def doubleSize ()
grow(2Q?)
end
end
irb(main):075:0> rect2=Rectangle.new(3Q?)
=> #<Rectangle:0x59a3088 @width=4Q @height=3>
irb(main):076:0> rect2.doubleSize()
=> "New area: 48"
irb(main):077:0> rect2.grow()
NoMethodError: private method 'grow' called for #<Rectangle:0x59a3088 @width=8Q @height=6>
from (irb):77
from :0
]]>
class BankAccount @@interestRate = 6.5 def BankAccount.getInterestRate() @@interestRate end attr_accessor :balance def initialize (bal) @balance = bal end end |
如你所见,cd量必d使用前初始化Qƈ且就象实例变量一P如果你想存取cd量的话,你需要编写存取器Ҏ。在此,我定义了一个类Ҏ来返回利息率。注意,cd和在getInterestRate前面的句可CZ个类Ҏ。一个类ҎQ不对于Q何实例,其工作方式都是相同的-在此Q是把相同的利息率返回到所有的BankAccount实例。ؓ了调用类ҎQ你需要用类名,p它用于cL法定义中一?
irb(main):045:0> BankAccount.getInterestRate => 6.5 |
事实上,用于创徏cd例的"new"Ҏ是一个类Ҏ。因此,当你在程序中输入"Rectangle.new"Ӟ你实际在调用newcL?q是Ruby默认情况下所提供的?/p>
l承
面向对象~程的原则之一是支持类层次l构。就象自然界中的事物分类一Pcd总更ؓ通用的类q行l承。面向对象编E的特征主要体现在方法和变量的用上。例如,一个Squarecȝ承Rectanglecȝ一些特征,如方法和变量。一个Square是一U更具体cd的Rectangle(高度和宽度相{的Rectangle实例)Q但是它仍然有一个高度和宽度Q也有一个面U?而且与矩形的计算Ҏ相同)。在Ruby中,Squarecd以用下列定义创?
class Square < Rectangle end |
"<Rectangle"意味着QSquare是Rectangle的一个子c,或反q来_Rectangle是Square的一个超cR默认情况下Q一个Square实例自动地拥有所有一个Rectangle所拥有的相同的属性和ҎQ包括heightQwidth和areaҎ。ؓ了确保Square实例的边长相{,你可以重载现有的Square的initializeҎQ?/font>
class Square < Rectangle
def initialize (size)
@height = size
@width = size
end
end
因ؓ在Ruby中一切都是对象,所以Ruby中的一切几乎都z自ObjectcR尽这在所有类定义中都不是昑ּ的(你不会看?lt;Object出现在定义中Q,但是的确所有的c都z自Ruby的基cObject。知道这个事实后Q你׃更容易地理解接下来要讨论的内宏V?/font>
当编写你的应用程序时Q你可以在一个类定义外定义方法。在本文开始,你已看到了一个ƈ不是M一个类的一部分的摄氏到华氏转换器方法。作为另外一个示例,下面是一个位于Q何类之外的方法:
def feel?
return "I feel fine."
end
Z执行q个ҎQ只要输入该Ҏ名,而不需要类或实例:
irb(main):042:0> feel?
=> "I feel fine."
此方法看似另外一U语aQ如CQ中的函数或q程。事实上Q尽这些方法看上去好象不属于Q何类Q但是这些方法却都是你已l添加到ObjectcM的方法,它(因ؓObject是所有类的超c)反过来也把这一ҎdC的承类上。因此,现在你可以在M对象Q如Square和Rectangle的实例)甚至一个类Q如Rectanglec)上调用这个方法?/font>
irb(main):043:0> sq1=Square.new(4)
=> #<Square:0x5a18b50 @width=4Q @height=4>
irb(main):044:0> rect1=Rectangle.new(5Q?)
=> #<Rectangle:0x5a139a8 @width=7Q @height=5>
irb(main):045:0> sq1.feel?
=> "I feel fine."
irb(main):046:0> rect1.feel?
=> "I feel fine."
irb(main):047:0> Rectangle.feel?
=> "I feel fine."
xQ你是否注意到前面所有的CZ代码中都~少某种东西?N你必输入常敎ͼ实例变量或类变量?l对不是!q正是Ruby的真正面向对象的天性的一部分。ؓ此,首先让我们看一下Ruby中以前的普通变量。至此,你已l创Z很多Rectangle实例Q但是你q没有把它们保留多长旉。比方说Q你惌把一个变量赋值给你创建的一个Rectangle实例:
myRectangle = Rectangle.new(4Q?) |
在Ruby中这是完全有效的代码Q而且Ҏ不需要另一行代码来把myRectanglecd化或声明为引用Rectangle的某U东ѝ在执行q一行代码以后,变量myRectangle引用一个Rectangle的实?高度和宽度值分别ؓ4Q?)。但是,q仅是一U在M时刻都可以更改的对象引用Q而与对象的类型无?在Ruby中一切都是对?。因此,下面的命令提C符行中Q你可以Ҏ地把myRectangle赋值给一个字W串:
irb(main):049:0< myRectangle=Rectangle.new(4Q?)
=> #<Rectangle:0x587c758 @width=5Q?@height=4>
irb(main):050:0< myRectangle="Jim's Rectangle"
=> "Jim's Rectangle"
你可以在许多其它E序语言(甚至包括象Javaq样的面向对象的语言)中试验一下,q观察从你的IDE所产生的编译错误?/p>
变量Q实例变量,cd量,甚至q有"帔R"其实都只是对象引用。它们引用对象,但是它们q不是对象本w。因此,它们可以被动态地改变Q甚臛_用另一U不同类型的对象?/p>
因ؓq一灉|性,所以必dRuby中进行一些约定以帮助每个人都知道某个变量正ؓ代码所使用。其实,你已l看C其中之一(@W号Q它意味着q是一个实例变?。其它的变量Q方法和cd名约定列于下?中?/p>
局部变?/td> | 全局变量 | 实例变量 | cd?/td> | 常数 | cd | Ҏ?/td> |
aVar | $Var | @var | @@var | VAR | MyClassmy | Method |
name | $debug | @lastName | @@interest | PI | Rectangle | area |
?.q个表包含了在Ruby~码U定下的相关CZ?/p>
操作W方?/strong>
现在Q假定你惛_现合qRectanglecȝ实例或把它们d到另一个Rectangle实例。你当然可以定义另外一个称?add"的方法,q种选择利用了Ruby真正的面向对象的特征之一。然而,你还可以重蝲"+"q算W来适当地把两个Rectangle实例加v来。这?+"Ҏ(?+5)Q对Ruby来说Q只是另外一个方法而已。由于只?另外一个方?Q所以你可以l它增加一些功能来满Rectanglecȝ需要。例如,你还可以定义"+"q算W来实现一个矩形面U加上另一个矩形面U?/p>
def + (anotherRectangle) totalArea = area() + anotherRectangle.area() Rectangle.new(@heightQtotalArea/@height) end |
在把q个Ҏd到RectanglecM后,你可以?Ҏ调用来把两个Rectangle的实例相?
irb(main):001:0> rect1=Rectangle.new(2Q?) => #<Rectangle:0x58aa688 @width=3Q?@height=2> irb(main):002:0> rect2=Rectangle.new(3Q?) => #<Rectangle:0x58a6ef0 @width=4Q?@height=3> irb(main):003:0> rect1+rect2 => #<Rectangle:0x58a4a60 @width=9Q?@height=2> |
q正是操作符重蝲Q对于那些用过AgolQC++QPython和其它语a的用h_可能已经非常熟悉q个特征?/p>
Ҏ参数
xQ我们一直假定,传递给一个方法的参数个数是已知的。也许在其它语言中不可思议Q但是Ruby的确允许你传递可变个数的参数q且以单个参数来捕获它们。ؓ了创Z个可变长度的参数Q只需要把一个星?*)攑֜最后一个参数前面即可。这P你就可以在Ruby中编写一个如下的多边形定义?/p>
class Polygon def initialize (s1Qs2Qs3Q?others) @sideOne = s1 @sideTwo = s2 @sideThree = s3 @otherSides = others end end |
如下所C,你可以用这个定义来创徏一个三角Ş或一个六边Ş?/p>
在支持可变长度参数的同时QRubyq允许定义一个方法参数的默认?在调用者没有提供的情况下?。例如,下面是Rectanglecȝ一个更好的初始化表达?/p>
现在Q在调用时如果省略了某参敎ͼ那么在定义中参数紧邻的赋D符担当一个缺省的赋值器。现在,当创Z新的矩ŞӞ如果在调用时省略了宽度,那么一个适当的宽度也会被默认地提?
irb(main):009:0> poly1=Polygon.new(2Q?Q?)
=> #<Polygon:0x594db10 @otherSides=[]Q?@sideThree=5Q?@sideTwo=4Q?@sideOne=2>
irb(main):010:0> poly2=Polygon.new(2Q?8Q?Q?Q?Q?)
=> #<Polygon:0x5948d58 @otherSides=[5Q?7Q?9]Q?@sideThree=4Q?@sideTwo=18Q?@sideOne=2>
def initialize (hgt = 1Q?wdth = 1)
@height = hgt
@width = wdth
end
irb(main):090:0> rect=Rectangle.new(2)
=> #<Rectangle:0x5873f68 @width=1Q?@height=2>
#对象-34的绝对?
-34.abs
#对一个QҎq行四舍五入处理
10.8.round
#q回一个字W串对象的大写且逆{的副?
"This is Ruby".upcase.reverse
#q回数学sinҎ的参C?
Math.method(:sin).arity
?.Ruby是全对象化的Q在Ruby中,整数QQҎQ字W串Q甚至类和方法都是对象。这里的代码展示了针对这些类型对象的Ҏ调用?
在Ruby中,所有功能都是通过调用对象上的ҎQ或操作Q实现的。事实上QRuby中的Ҏ调用p其它E序语言中的函数或过E调用一栗?/p>
p在所有面向对象程序语a中一P对象是从cM创徏的。Ruby库中提供了许多预构徏的类。你可以修改q些cL构徏你自qcRRuby中的cL使用"class"关键字定义的。类名开始是一个大写字母。类定义?end"关键字结束。因此,一个Rectanglecȝ定义可能有如下Ş式:
class Rectangle end |
Z把方法添加到c,可以使用def关键字。方法的定义也应该以end关键字结束。跟随def关键字和Ҏ名后面就是方法参数。把一个areaҎdC面的Rectanglecȝ代码看上d下所C:
class Rectangle def area (hgtQwdth) return hgt*wdth end end |
对于那些熟悉其它E序语言的用P他可能注意到一些差别。Rubyq不使用M花括h限定cLҎQ也不用分h其它字符来表C程序语句行的结束。Ruby的目标,Ҏ它的创徏者说明,是简单、易用ƈ使编码成Z?事"。谁惌住所有的那些分号Q没有意思!在Ruby中,只要你把语句攑֜一行上Q不需要分h其它代码行结束标记。顺便说一下,在areaҎ参数周围的括h不必要的。在默认情况下,Rubyq回一个方法中最后的内容Q因此return关键字也可以省略。因此,你可以徏立如下简单编码的Rectanglec:
class Rectangle def area hgtQ wdth hgt*wdth end end |
管上面代码是有效的Q但是小括号q是被推荐用于Ҏ参数表达的,q主要是Z实现较好的可L?/p>
实例变量和属?/strong>
cM可以有实例变量(在一些语a中也UCؓ属性)。例如,由Rectanglecd建的对象应该都有一个高度和宽度。在Ruby中,实例变量不必昑ּ地在cM声明Q只是必d它们的命名中以一个特D字W来标记和用。具体地_所有的实例变量名都?@"开头。ؓ了实现当调用areaҎӞ存储矩Ş实例的高度和宽度Q你仅需把实例变量添加到areaҎ卛_Q?/p>
class Rectangle def area (hgtQ wdth) @height=hgt @width = wdth @height*@width end end |
更确切地_当创Z个Rectangle实例Ӟ应该指定高度和宽度,而实例变量在此时才确定。另外,Ruby提供了一U特D的ҎinitializeQ它允许你徏立或准备cȝ新实例:
class Rectangle def initialize (hgtQ wdth) @height = hgt @width = wdth end def area () @height*@width end end |
Rectangle.new(4Q?) |
或,你可以用没有括L形式Q?/font>
Rectangle.new 4Q?
q个例子创徏了一个新的Rectangle对象q且调用了initializeҎQ其中传入参??。注意,在下面的代码中添加了height和widthҎ以便׃n高度和宽度信息:
class Rectangle def initialize (hgtQ wdth) @height = hgt @width = wdth end def height return @height end def width return @width end def area () @height*@width end end |
同样Qؓ了另外某个Ҏ能够更新或设|一个Rectangle对象的高度和宽度Q需要定义其它一些设|方法:
class Rectangle def initialize (hgtQ wdth) @height = hgt @width = wdth end def height return @height end def height=(newHgt) @height=newHgt end def width return @width end def width=(newWdth) @width=newWdth end def area () @height*@width end end |
译者注 本文中的mutator和accessor相当于其它语a中的setter和getter?/p>
上面的mutatorҎQ?height="?width="Q可能看h有点秘Q但是它们确实只是一些方法。不要让命名中的{号蒙骗了你。在Ҏ名最后的额外字符对于Rubyq不意味着什么,但是它提高了代码的可L。请看下列代码:
aRectangle.height=27 |
在此Q一个Rectangle对象的高度正被赋|改变Q。事实上Q这仅是一个对Rectangle对象?height="Ҏ的调用?/p>
因ؓ授予C个对象的实例变量的存取权限非常普通,所以Ruby提供了一l关键字来实Cơ性定义实例变量和accessor/mutatorҎQ从而ɘq些实例变量成ؓ"public"属性。这些关键字是attr_readerQattr_accessor。它们有助于极大地简化代码:
class Rectangle attr_accessor :heightQ?width def initialize (hgtQ wdth) @height = hgt @width = wdth end def area () @height*@width end end |
在上面的CZ代码中,attr_accessorl出了Rectangle相应于height和width属性的getter和setter?/p>用交互式Ruby构徏应用E序
现在Q你已经知道如何构徏一个简单的Ruby应用E序。ؓ了展CRuby解释器的交互性,让我们启动一个交互的Ruby帮助和控制台工具Q用Ruby安装的fxri工具Q,见图6?/p>
?.启动fxriQ从Windows开始菜单中打开交互式Ruby工具fxri?
在窗口的右下Ҏ一个交互式的Ruby命o提示W(?irb(main):001:0>"Q,它在H口打开时显C出来。你可以q入到irb命o提示W行中ƈ输入"Rectangle.new(6Q?).area()"。之后,你应该看到如下结果:
irb(main):013:0> Rectangle.new(6Q?).area() => 30 |
z有力!
在Ruby中,cM来不关闭。这意味着Q你L可以在一个现有类上添加或重定义方法。例如,你还可以在你创徏的RectanglecMd一个circumferenceҎ。在命o提示W上Q请逐行输入下列代码Q?/p>
class Rectangle def circumference () @height * 2 + @width * 2 end end |
?.输入Rectanglec:把Rectanglecȝ定义输入到fxri交互式Ruby解释器中Q见图中的右下方?
Rectanglecd被定义了一ơ?不,Ruby解释器知道你正在修改当前的Rectanglec,它把一个新Ҏd到现有RectanglecM。现在,在命令提C符上输入下列一行:"Rectangle.new(2Q?).circumference()"。你应该看到cM如下的结果:
irb(main):014:0> class Rectangle irb(main):015:1> def circumference() irb(main):016:2> @height * 2 + @width * 2 irb(main):017:2> end irb(main):018:1> end => nil irb(main):019:0> Rectangle.new(2Q?).circumference => 10 |
Z重新定义RectanglecM的Q何方法,例如areaҎQ只需单地重新输入h新的areaҎ定义的类定义卛_Q?/p>
irb(main):020:0> class Rectangle irb(main):021:1> def area() irb(main):022:2> @height*2 irb(main):023:2> end irb(main):024:1> end => nil irb(main):025:0> Rectangle.new(6Q?).area => 12 |
在上面的单例子中QareaҎ被重新定义以便Lq回原来高度?倍?/p>
一个类永远不会被关闭的思想可以应用于你自己定义的类和该语言中的内嵌cM。ؓ了说明问题,让我们把一个areaҎd到StringcR在命o提示W中输入下列代码Q?
class String def area() length() end end |
现在Q你在定义一个字W串?area"Ҏ以返回该字符串的长度。现在,你可以把你的名字作ؓ一个字W串来试用一下这个新ҎQ见下面代码Q?/p>
irb(main):026:0> class String irb(main):027:1> def area() irb(main):028:2> length() irb(main):029:2> end irb(main):030:1> end => nil irb(main):031:0> "Jim".area => 3 |
在本文示例中Q我们用Ruby的交互式Ҏ及其开发环境来试q种语言Q而且我们仅用了较小的代码片断?/p>
你是否听说过Ruby?如今Q它成了软g开发界的一个流行话题。该语言在去q春天的一ơJava会议上引h的注意,当时象Bruce TateQDave Thomas{著名h物都在谈论Rubyq且告诉在场的观众Ruby值得一看?/p>
现在Q如果你象我一h在从事Y件开发,那么我们有p:管学习一U新的编E语a可能是一件趣事,但是只有你对它具有深入了解之后,你才有资g一U怀疑眼光来看待另一U编E语a。毕竟,在上世纪八、九十年代的~程语言之争最l得出结?从根本上看存在两大阵?Java世界和微软基?NET支持的开发语a。ƈ不是我不惛_习另一U语aQ其实我只是期望通过选择其它~程语言才能获得一定技术优势的日子早点l束。然而,׃前面几位著名人士的媄响,我决定一试Ruby?/p>
好,假定"我已l到q山?Q那么本文就是我对Ruby的研I报告?/p>
二?安装Ruby
Ruby是一U开源的~程语言Q由日本的Yukihiro Matsumoto在九十年代中期开发。你可以在www.ruby-lang.org站点得到Ruby。这U语a最初被作ؓ一U脚本语a创徏Q可应用于许多^CQ包括Linux、各U类UNIX、MS-DOS、Windows、BeOS、Amiga、Acorn Risc OS和MacOS X。当前Ruby的最新版本是1.8.4。对于用Windowsq_的用P你可以点按这里来得到一?one-click"型Windows安装E序。随同基本的Ruby二进制文件和库文Ӟq一下蝲中还包含一些有用的(q且是免费的)IDE和工P包括帮助文档和示例代码,RubyGems包管理器QFreeRIDE(免费的Ruby IDE)QFox GUI库,fxri(一U搜索引擎和Ruby文档的GUI指南Q还有一个交互式命o行工?和SciTE(Scintilla文本~辑器IDE)。在写本文时QWindows安装E序所提供的Ruby?E_"版本?.8.2Q还有一?.8.4版本的预览版。注意,本文中的CZ代码是用Windows安装E序所提供?.8.2版本~写的?/p>
使用Windows安装E序安装Ruby是相当直接的事情。你只要下蝲q运行一个简单的可执行安装文?ruby182-15.exe)Q这个程序就会启动一个标准的安装向导。下载文件大U有15MBQ在向导把Ruby安装到Windowsq_上后占大U?0MB的硬盘空间?/p>
对于那些偏爱自己的编辑器的程序员Q大量的~辑器都提供了对Ruby的支持,包括emacsQvimQJEditQJedQNedit和Textpad。当Ӟq有著名的Ruby Eclipse工程。Ruby开发工?RDT)是一UEclipse插gQ当前仍处于早期开发中Q但是你可以从此处下载试用它。另外,市场上还有一些便宜的Ruby IDEQArachno Ruby是其中之一?/p>
q行Ruby
p许多解释性语a一PRuby提供l程序员多种开发代码的Ҏ。你可以使用命o行工具以交互方式q行Ruby或者创Z个RubyE序文gQ然后要求Ruby的解释器执行此程序?/p>
在Windows中,打开命o行提C符H口Q在提示W上输入"Ruby"q回?注意:你应该能够ɾpȝ沿Ruby的\bin目录扑ֈRuby可执行文?。那么,Ruby׃q行q等候你输入E序。输入下面的E序Q然后按Ctrl+D再按回R键,你就会看到Ruby执行你的E序Q如?所C?/p>
def convertCtoF (celsius) print(celsius.to_s + " degrees celsius is " + ((celsius * 9)/5 + 32).to_s + " degrees in fahrenheit\n") end convertCtoF(20) |
?.在Ruby中以交互方式q行摄氏到华氏温度{换计?/p>
?中的转换E序也可以用一URuby IDE或简单文本编辑器实现q保存到一个文件中-例如convertCtoF.rb(.rb是RubyE序的常用文件类?。现在,Ruby解释器将执行q个文g中的RubyE序Q见??/p>
?.q行convertCtoF.rb
那些熟悉SmalltalkQCommon Lisp Object System(CLOS)Q或其它解释性编E环境的用户肯定都会熟悉交互的开发环境。交互特点允怽用小块编E代码进行试验。通过使用一个特D的Ruby批处理文件irb.batQ你p够克服Ruby解释器的非交互性特征。图3昄了用irb.bat命o启动的Ruby。现在,代码可以被逐行地输入,解释和测试?/p>
?.交互式Ruby
交互式Ruby特征也被嵌入到若q工具中。例如,Ruby文档的图形接口fxriQ不仅可作ؓ一U语a指南Q而且可以用作一U交互式Ruby解释?见图4)?/p>
?.fxri的交互式Ruby能力:在此Qfxri也用来运行和?相同的Ruby命oQ但q是从文档工具内部运行的?/p>