ruby 一些简单的例子

现在我们将前面的一些示例程序的代码坼开来分析一下.

下面的例子出现在简单的例子一节.

def fact(n)  
    if n == 0    
       1  
    else    
       n * fact(n-1)  
    end
end
print fact(ARGV[0].to_i), "\n"

因为是第一次解释,我们将逐行分析.

def fact(n)

第一行,def 用于定义一个函数(或者,更准确地说,一个方法(method);我们会在稍后的一节中详细讨论什么是一个方法).这里,它指明 fact 函数带一个参数,也就是 n.

if n == 0

if 用来检查一个条件.当条件吻合时,执行下面的代码;否则执行跟在else后的代码.

1

当条件成立时if 的值为 1.

else

如果条件不成立,执行从这里到end的代码.

n * fact(n-1)

如果条件不满足, if的值会是n乘fact(n-1)的结果.

end

第一个 end 与 if 语句对应.

end

第二个 end 与 def 语句对应.

print fact(ARGV[0].to_i), "\n"

这句用由命令行指定的值来调用fact()函数并打印结果.

ARGV是一个包含命令行参数的数组.ARGV的成员是字符串,所以我们必须通过to_i转化其为整数. Ruby并不像Perl那样自动将字符串转化为整数.

Hmmm...如果向程序赋一个负值作为参数会怎样?你看到这个问题了吗?你可以修复它吗?

Strings

下面我们来检查在字符串这章中出现的猜谜程序.由于这个要长一点,我们为每一行打上行数.

01 words = ['foobar', 'baz', 'quux']
02 secret = words[rand(3)]
03
04 print "guess? "
05 while guess = STDIN.gets
06   guess.chop!
07   if guess == secret
08     print "you win\n"
09     break
10   else
11     print "you lose.\n"
12   end
13   print "guess? "
14 end
15 print "the word is ", secret, ".\n"

这个程序里,我们使用了一个新的控制结构 while.只要某个指定的条件保持为真,while和它对应的end之间的代码会重复执行.

行2的rand(3)返回一个介于0-2之间的随机数.这个随机数用于提取数组 words 中的一个成员.

在行5我们通过STDIN.gets方法从标准输入读取一行.如果读行遇到时 EOF (文件结束), gets会返回nil.因此,与while相连的代码会一直执行直到它遇到^D(或DOS下的^Z),表示输入的结束.

行6的guess.chop!去掉 guess 的最后一个字符;那一定是个换行符.

行15,我们打印出要猜的词.我们写的代码是上向 print 语句传递三个参数(这三个参数一个接一个地打印),但也可以用一个参数等效地打印: 将secret写为 #{secret}以表明将它是一个要取值的变量,而非一个要打印的一般文字:

print "the word is #{secret}.\n"

正则表达式

最后我们来看看正则表达式一节的那个程序.

01 st = "\033[7m"
02 en = "\033[m"
03
04 while TRUE
05   print "str> "
06   STDOUT.flush
07   str = gets
08   break if not str
09   str.chop!
10   print "pat> "
11   STDOUT.flush
12   re = gets
13   break if not re
14   re.chop!
15   str.gsub! re, "#{st}\\&#{en}"
16   print str, "\n"
17 end
18 print "\n"

在行4,while的条件被硬设为 true,因此这好像构成了一个无限循环.但我们在行8和行13放置了break语句以跳出循环.这两个break语句也是 if 修饰辞(if modifier)的一个例子.一个"if修饰辞"当且仅当指明条件满足时执行它左边的语句.

再说说 chop! (出现在行9和行14).在Ruby里,我们亦可将"!"和"?"附于某些方法名字后面.惊叹号(!,有时大声地念作"bang!")暗示某些东西可能具破坏性(destructive),也就是指,某些东西可以改变它所触及的东西. chop!直接作用于一个字符串,但不带!的chop只会产生一个拷贝.下面有这一区别的演示.

ruby> s1 = "forth"
  "forth"
ruby> s1.chop!       # This changes s1.
  "fort"
ruby> s2 = s1.chop   # This puts a changed copy in s2,
  "for"
ruby> s1             # ... without disturbing s1.
  "fort"

以后你还会遇见以问号(?,有时大声地念做 "huh?")结束的方法名;这指"断言"(prediacte)方法,只会返回true或false.

行15应给予注意.首先,注意gsub!也是一个破坏函数.它通过替换所有符合 re 模式字符来修改 str(sub指替换,首字母 g 指全局, 比如,替换所有的匹配而不只是第一个匹配).到此为止,还好;但我们用什么来替代文本中的匹配部分呢? 在行1和行2里的 st 和 en 被分别定义为表示反转文本颜色(color-inverted)和恢复正常文本颜色的ANSI码. 在行15,它们被#{}括起以确保他们被前面定义的那样解释(这样我们才没看见变量名被打印出来).在这中间是 "\\&".这是个小把戏.因为替换字符串是由双引号引起的,一对反斜杠会被解释为一个单一的反斜杠;所以 gsub!实际上得到的是"\&",就一段特殊代码正好就是表示"任何与模式于第一处匹配的字符".因此新的字符串在被打印出来的时候,很像原来的那个,只不过匹配的部分以反视(inverse video)的方式高亮度显示出来.

(0)

相关推荐

  • 简单的Ruby中的Socket编程教程

    Ruby提供了两个级别访问网络的服务,在底层你可以访问操作系统,它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持. Ruby 统一支持应用程的网络协议,如FTP.HTTP等. 不管是高层的还是底层的.ruby提供了一些基本类,让你可以使用TCP,UDP,SOCKS等很多协议交互,而不必拘泥在网络层.这些类也提供了辅助类,让你可以轻松的对服务器进行读写. 接下来就让我们来学习如何进行 Ruby Socket 编程 什么是 Sockets 应用层通过传输层进行数据通信时,TCP和U

  • ruby 流程控制 方法

    这章我们将讨论更多的Ruby流程控制. case 我们用case语句测试有次序的条件.正如我们所见的,这和C,Java的switch相当接近,但更强大. ruby> i=8 ruby> case i     | when 1, 2..5     |   print "1..5\n"     | when 6..10     |   print "6..10\n"     | end 6..10    nil 2..5表示2到5之间的一个范围.下面的表达式

  • ruby 数组使用教程

    你通过在方括号里列出元素并用逗号将它们相互隔开来创建一个数组. Ruby的数组可以适应不同的对象类型 ruby> ary = [1, 2, "3"]    [1, 2, "3"] 就像前面提到的字符串一样.数组也可以相乘或相加 ruby> ary + ["foo", "bar"]    [1, 2, "3", "foo", "bar"] ruby> 

  • ruby 一些简单的例子

    现在我们将前面的一些示例程序的代码坼开来分析一下. 下面的例子出现在简单的例子一节. def fact(n)       if n == 0            1       else            n * fact(n-1)       end end print fact(ARGV[0].to_i), "\n" 因为是第一次解释,我们将逐行分析. def fact(n) 第一行,def 用于定义一个函数(或者,更准确地说,一个方法(method);我们会在稍后的一节中详

  • 使用Ruby实现简单的事物驱动的web应用的教程

    简介 对 Web 应用程序来讲,自动化的集成测试是一个非常重要的部分, 然而由于这些测试用例太依赖具体的 Web 页面的实现细节,这就给编写和维护带来的很大的挑战. 通常来讲有两种方法可以生成 Web 应用程序测试用例. 手工编写脚本:测试人员需要知道 Web 页面上有哪些表单.输入框.选择框.按钮等,以及这些表单元素的名称,ID 等属性,然后才能利用一些工具来编写测试用例.     通过工具录制生成:比如 IBM Rational Functional Tester 就提供了录制用户在 Web

  • Freemarker 最简单的例子程序

    Freemarker 最简单的例子程序 freemarker-2.3.18.tar.gz http://cdnetworks-kr-1.dl.sourceforge.net/project/freemarker/freemarker/2.3.18/freemarker-2.3.18.tar.gz freemarker-2.3.13.jar: 链接: http://pan.baidu.com/s/1eQVl9Zk 密码: izs5 1.通过String来创建模版对象,并执行插值处理 执行后,控制台

  • .NET开发基础:从简单的例子理解泛型 分享

    从简单的例子理解泛型话说有家影视公司选拔偶像派男主角,导演说了,男演员,身高是王道.于是有下面代码:  复制代码 代码如下: //男演员实体类public class Boy{    //姓名    private string mName;    //身高    private int mHeight;    public string Name {        get { return this.mName; }    }    public int Height {        get

  • 利用XML开发留言板简单的例子

    XML是一种基于文本格式的元标记语言,它注重对数据结构和数据意义的描述,实现了数据内容和显示样式的分离(xml+xsl),而且是与平台无关的. 由于XML注重数据内容的描述,因而,对于数据的检索非常有意义,我们不会再象HTML那样,检索出与我们要求无关的信息. 另一方面,XML文件是数据的载体,利用XML作为数据库,不需要访问任何数据库系统,我们可以使用任意WEB技术来显示我们的数据,比如HTML,FlashMX 等. 由于世界各大计算机公司的积极参与,XML正日益成为基于互联网的数据格式新一代

  • 通过一个简单的例子学会vuex与模块化

    前言 Vuex 强调使用单一状态树,即在一个项目里只有一个 store,这个 store 集中管理了项目中所有的数据以及对数据的操作行为.但是这样带来的问题是 store 可能会非常臃肿庞大不易维护,所以就需要对状态树进行模块化的拆分. 这篇文章预设你已经了解vue相关的基础知识,因此本文不再赘述.需要学习的朋友可以参考这篇文章:http://www.jb51.net/article/110212.htm 对vuex的定位和解释可以看官方文档,说的很详细了,需要的朋友也可以通过这篇文章进行详细的

  • 详解vuex的简单todolist例子

    一个简单的vuex应用的小例子,一段自己的学习记录. todolist就是一个简单的输入框,一个按钮,一个文本显示区域,可以逐条进行删除. 1.在用vue-cli生成好的HelloWorld.vue文件中直接写代码,先删除所有的自带代码 <template> <div class="hello"> <input type="text"> <button>增加事项</button> <ul> &l

  • 利用一个简单的例子窥探CPython内核的运行机制

    我最近花了一些时间在探索CPython,并且我想要在这里分享我的一些冒险经历.Allison Kaptur的excellent guide to getting started with Python internals有一点啰嗦,我想逐步介绍我自己的探索过程会更加有条理性,这样也许其他好奇的Python使用者可以跟着一起做. 1.注意到了一些奇怪的事情 一开始,我只是设置好Nose对一些我写的Python 3代码进行测试.当我运行这些测试的时候,我得到了一个不可思议的错误信息:"TypeErr

  • webpack4 入门最简单的例子介绍

    webpack在目前来说应该是前端用的比较多的打包工具了,那么对于之前没有接触过这块的该怎么办呢?答案很明显嘛,看资料,查文档,自己去琢磨,自己去敲一敲,跑一跑: Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载的模块进行代码分割,等到实际需要的时候再异步加载. webpack和Grunt以及Gulp相比有什么特性 Gulp/Grunt是一种能够优化前端的开发流程的工具,而WebPack是一种模块化的

  • js定义对象简单学习例子

    无标题页 function student(name,sex,age){ this.name = name; this.sex = sex; this.age = age; this.resume = resume; } function resume(){ return (this.name + this.sex + this.age); } var myStudent = new student("阿会楠","男",22); var resume = myStu

随机推荐