突然发现ruby也不错,准备学个入门。这是一篇关于Ruby的简短介绍,完整阅读只需要20分钟。这里假设读者已经安装了Ruby。如果你还没有,请在阅读文章之前访问Ruby的官方网站下载并安装。
交互式的Ruby
打开IRB(交互式Ruby Shell):如果使用Mac OS X,请打开终端窗口,输入irb;
如果你用的是Linux,那么请打开shell,进入irb;
如果你使用windows,那么请在开始菜单中找到Ruby-fxri并执行它。
好的,打开IRB后,在里面输入‘Hello World’。
Ruby听从你的安排!
发生了什么事?我们刚刚是不是写了世界上最短最小的“Hello World”程序?这不太准确。第二行输出是IRB告诉我们的:前面表达式的求值结果。如果我们想打印出“Hello World”,那么我们还需要一点努力:
Puts是Ruby中一个简单的打印输出命令。它后面的“=nil”是什么意思?3354这就是表达式的结果。Puts总是返回nil,这是Ruby中“绝对肯定没有值”的方式。它看起来有点类似于Java中的null。
你的免费计算器在这里!
无需做任何事情,我们可以将IRB用作简单的计算器:
这样会算出3 2。够简单!3乘以2怎么样?你可以在下面继续输入3*2,也可以回到上面(3 * 2)修改刚刚输入的计算公式。用键盘上的向上键使光标到达3 ^ 2行,然后用左键将光标移动到加号,再用空格键修改。
接下来,让我们试着计算3的平方:
在Ruby语言中,* *的意思是取幂。那么如何计算平方根呢?
好的,等一下,表达式中的sqrt(9)是什么意思?你可以猜到这是9的平方根。而数学是什么意思?别急,下面我们再来了解一下类似数学这样的模块。
模块——代码按主题分组
Math是Ruby内置的数学模块。在Ruby中,模块提供了两个角色:一个是将相似的方法分组到同一个“家族”名下。所以数学也包括sin,tan等方法。第二个作用是一个点,标记消息的接收者。什么是新闻?在上面的例子中,sqrt(9)是消息,这意味着调用sqrt方法来获得9的平方根。
Sqrt方法调用的结果是3.0。你可能会注意到它不是3。这是因为在大多数情况下,一个数的平方根不是整数,所以这里返回一个浮点数。
那么我们如何记住这些计算结果呢?将结果赋给一个变量。
你什么意思?这就是Ruby将其他字符插入字符串的方式。放在花括号之间的字符串(此处的名称)将被外部字符串替换。您还可以使用string类中内置的capitalize方法来确保某人的首字母大写:
上面的代码有两点需要说明:
首先,我们调用不带括号的方法,因为括号是可选的;
第二,这里默认的参数值是“World”。也就是说,如果调用方法时没有提供name参数,将使用默认值“World”。
进化为Greeter!
我们是否需要一个真正的迎宾员,他能记住你的名字,问候你,并总是带着尊重对你表示善意?那么最好构建一个“欢迎者”类:在上面的类代码中,定义了一个名为Greeter的类和一些类方法,其中出现了一些新的“关键字”:请注意“@name”,这是类的一个实例变量,对类中的所有方法(say_hi和say_bye方法)都有效。
如何让迎宾班发挥作用?现在让我们建立一个欢迎对象并使用它!
Greeter类的实例对象G建立后,接受name参数(值为Pat)。那么我们可以直接访问name吗?
看上面的编译错误,直接访问name是不可行的。
窥视物体内部。
对象中的实例变量总是隐藏在其中,但也不是没有痕迹。你可以通过观察物体来观察它们。当然,还有其他的访问方法,但是Ruby采用了很好的面向对象的方法来隐藏数据。
哇!方法那么多,我们只定义了两个?其他方法从何而来?不用担心,instance_methods方法列出了Greeter对象的所有方法,包括在父类中定义的方法。如果我们只想列出Greeter类的方法,可以用false作为参数调用instance_methods方法。True意味着我们不需要父类定义的方法。
哈哈,这就是我们想要的。让我们看看欢迎对象可以响应哪些方法:
它知道say_hi,to_s(这个方法把一个对象转换成一个字符串,这是任何对象都必须的默认方法,很像Java里的toString方法),但是不知道名字。
随时修改类定义
如何查看或修改名称?Ruby提供了一种访问对象变量的简单方法:
在Ruby中,你可以打开一个类并多次修改它。并且由修改带来的改变将被应用于在那之后建立的任何新对象,甚至是现有的这样的对象。让我们创建一个新对象并访问它的@name属性。
我们使用attr_accessor定义了两个方法:
";name”用于获取name属性的值;
".name="用于设置namee属性的值。
这非常类似于在Java类中访问由Public修饰的成员变量。
!将使用此参数进行输出。
大多数其他编程语言使用循环遍历列表。下面是C语言中循环的一个例子:
上面的代码显然是有效的,但是还不够“优雅”!你必须使用冗余的循环变量I,在解释如何遍历链表之前,你还需要指出链表的长度。
Ruby的迭代方法更优雅。所有内部管理细节都隐藏在每个方法中。你需要做的就是告诉它如何处理每个成员。Block,红宝石边缘的亮点!
block的真正优势在于它可以处理比列表更复杂的对象。除了简单的内部管理细节之外,您还可以在方法中处理安装、拆卸和所有错误,而不会引起用户注意。
say_bye方法不使用each,而是检查@names是否有join方法,如果有,就调用join方法。否则,它将直接打印@names变量。
这种方法并不关心变量的实际类型,而是依赖于它所支持的被称为“duck typing”的方法:Duck Typing是动态类型的一种形式:变量本身的值隐式地决定了变量的行为。这意味着一个对象可以与实现相同接口的其他对象互换,而不管这些对象之间是否存在继承关系。鸭子测试是鸭子打字的比喻,——“如果它走路像鸭子,那么它一定像鸭子一样嘎嘎叫,那么它一定是鸭子”。Duck typing是一些编程语言的特性:比如Smalltalk、Python、Ruby、ColdFusion。
鸭子分型的好处是不需要严格限制变量的类型。如果有人使用一种新类型的list类,只要它实现了与其他list相同语义的join方法,就可以使用。
启动脚本
文件前半部分是MegaGreeter类的代码,其余部分是对这些类的方法的调用。这是我们值得注意的最后一点:__FILE__是一个代表当前文件名的“神奇”变量。$0是用于启动程序的文件名。那么代码“if _ _ file _==$0”就是检查这个文件是否是要使用的主程序文件。通过这样做,程序文件可以被用作代码库而不是可执行代码;但是当这个文件作为执行文件的时候,也是可以执行的。
如何进一步学习Ruby
这本入门书到此结束。当然,有很多东西值得浏览:Ruby提供的各种控件结构;和使用区块产量;用作模块混合等。希望这第一次体验Ruby能让你对Ruby更感兴趣。
注意:mixin是一个类,在面向对象的编程语言中提供了一些函数给子类继承,但是mixin不能实例化。从mixin继承不是一种特殊的形式,但它更适合于集合函数。一个子类甚至可以选择通过继承一个或多个mixin来继承它的全部或大部分功能。mixin可以将定义和绑定方法延迟到运行时,而属性和实例参数直到编译时才会被定义。这与最常见的方式不同:定义所有属性和方法,并在编译时初始化它们。