Ruby基础知识整理

更新时间:2023-05-17 23:42:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

Ruby基础知识整理

飞奔的小鱼苗,QQ:605794686

目录

语言特性与历史......................................................................................................1简介...............................................................................................................1命名由来........................................................................................................1设计理念........................................................................................................2语言特性........................................................................................................2寻求帮助........................................................................................................6变量......................................................................................................................6语句......................................................................................................................7条件语句........................................................................................................7循环语句........................................................................................................7异常处理........................................................................................................7数据结构................................................................................................................7字符串...........................................................................................................7字符串基本操作.......................................................................................7正则表达式 .............................................................................................8数组...............................................................................................................9哈希.............................................................................................................12程序结构..............................................................................................................14方法.............................................................................................................14语句块.........................................................................................................14Proc............................................................................................................14元编程.........................................................................................................14类................................................................................................................14反射机制......................................................................................................15转载....................................................................................................................15ruby之程序结构 ..........................................................................................15什么是Ruby之道?.......................................................................................23

语言特性与历史

简介

Ruby,一种为简单快捷面向对象编程(面向对象程序设计)而创的脚本语言,由日本人松本行弘

(まつもとゆきひろ,英译:Yukihiro Matsumoto,外号Matz)开发,遵守GPL协议和Ruby License。Ruby的作者认为Ruby > (Smalltalk + Perl) / 2,表示Ruby是一个语法像Smalltalk一样完全面向对象、脚本执行、又有Perl强大的文字处理功能的编程语言。

1993年发明,1995年公开发布,与Java发布时间同年,目前有JRuby分支和JRuby到Java的编译器。

命名由来

因为Perl的发音与6月的诞生石pearl(珍珠)相同,因此Ruby以7月的诞生石ruby(红宝石)

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

命名。

设计理念

减少编程时候的不必要的琐碎时间,令编写程序的人高兴,是设计 Ruby 语言的 Matz 的一个首要

的考虑;其次是良好的界面设计。他强调系统设计必须强调人性化,而不是一味从机器的角度设想。   “ 人们特别是电脑工程师们,常常从机器着想。他们认为:“这样做,机器就能运行的更快;这样做,机器运行效率更高;这样做,机器就会怎样怎样怎样。”实际上,我们需要从人的角度考虑问题,人们怎样编写程序或者怎样使用机器上应用程序。我们是主人,他们是仆人。 ”

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

语言特性

1、Ruby 是面向对象语言。 这意味着什么呢?的确,关于“什么是 OOP”,每十位程序员当中恐怕就有十二种看法。这个问题我留待您自己判断。而就特征而言,Ruby 提供了机制,将数据和方法封装到对象里,实现了一个类到另一个类的继承机制,还提供对象多态机制。与某些语言(C++、Perl 5 等等)不同的是,Ruby 从一开始的时候就是以面向对象为目标来设计的。

2、Ruby 是“纯正”的 OOP 语言。 我说重复了么?我可不这么认为。说“纯正”,这就意味着,所有的一切——包括字符串或整型之类的基本数据类型——都是以对象的形态来表达的。在 Ruby 中用不着 Java 里面提供的那种 wrapper class(包裹类)(译注:wrapper class 用来将基本类型包装成对象类型)。而且,甚至连常量都被当作对象来对待,因此方法可以由——比如数字常量——来唤起。 3、Ruby 是动态语言。 对于只熟悉诸如 C++、Java 等静态语言的人而言,这就是个新概念。所谓动态意味着,可以在运行期动态地追加或者重新定义方法和变量。这种动态机制免除了对 C 语言中条件编译(#ifdef)这类功能的需要,并且使构建复杂的 reflection(内省机制)API 成为可能。复杂的 reflection 机制又进而使得程序可以变得更为“自知(self-aware)”——从而为如下诸多功能开启了方便之门:运行期类型信息、丢失方法的侦测、能够侦测新追 加的方法的钩子技术,等等。从这个方面来看,Ruby 与 Lisp 和 Smalltalk 有些许亲缘关系。

4、Ruby 是解释型语言。 这是个复杂问题,值得多说几句。有人可以争论说,从性能方面来考量,语言采用解释型机制弊大于利。对于这种想法,我用下面的斟酌予以回应:1. 首先最为显著的是,快速开发周期(rapid development cycle)颇有效益可得,Ruby 的解释型语言本质助长这种效益。2. 太慢到底是多慢呢?说慢之前请先做一些性能测试。3. 尽管会有人因此而批评我,但我还是要这么说:处理器每年都在持续提速。4. 如果您着实需要速度,您可以用 C 语言撰写需要速度的那部分代码。5. 最后,从某种意义上说,有一种值得商榷的观点:鉴于没有哪种语言是从骨子里就被解释,因此并不能说不可能撰写出 Ruby 编译器。

5、Ruby 能够处理正则表达式。 多年以来,正则表达式一直被认为是属于 UNIX 领域的雕虫小技,涉及诸如 grep 和 sed 之类的阳春工具,或是在 vi 里面做一些讨巧的“查找-替换”操作。Perl 语言帮助

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

人们改变了这种看法,而现在 Ruby 也对此有所帮助。越来越多的人认识到这种超高级的字符串和文本操纵技巧中所蕴含的无比威力。对此持怀疑态度者,应该去读一读 Jeffrey Friedl 的书 Mastering Regular Expressions 。非怀疑论者也应该读。

6、Ruby 是支持多种平台的语言。 Ruby 可以运行在 Linux 及其他 UNIX 变体、各种版本 Windows 平台、BeOS,甚至 MS-DOS 上。如果我没记错的话,还有 Amiga 版本的。

7、Ruby 借鉴了前辈语言。 这是好事儿吗?在文学领域之外,是的,这是好事儿。牛顿说,“若我看得比别人远,乃是因为我站在了巨人的肩上”。Ruby 确实是站在了巨人的肩上。Ruby 引借了来自 Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell,以及其他语言的特性。我看到其中的原则是:1. 不要重新发明轮子;2. 不要修补没有问题的部分;3. 特别重要的是,充分利用人们现有的知识。您掌握 UNIX 里面的文件和管道(pipes)吗?没问题,您可以在 Ruby 中运用到那些知识。您花了两年时间研习 printf 的各种格式符号?别担心,您在 Ruby 里面还可以使用 printf。您了解 Perl 的 regex handling 技术?好的,那么您几乎也就立刻学会了 Ruby 的 regex handling 技术。

8、Ruby 具创新性。 这一条与第7条有些矛盾吧?唔……是有一点;每个硬币都有两面嘛。Ruby 有一些特征极具创新性,比如非常有用的 mix-in 概念。或许这些创新型特征将来会被新的语言借鉴。(注:一位读者向我指出,LISP 至少早在 1979 年就有 mix-in 了。这一点我倒是完全没有注意到;我当另寻一个更好的例证,保证其真确性。)

9、Ruby 是特高级语言(Very High-Level Language,VHLL)。 这个问题有待商榷,因为术语 VHLL 还未被广泛使用,而其含义更是比 OOP 的含义更具争议性。我说“特高级”指的是,Ruby 可以通过相对较少的指令掌控复杂的数据结构并对其进行复杂的操作,符合了被一些人称为“最少投入”的原则(Principle of Least Effort)。

10、Ruby 有智能垃圾收集器。 诸如 malloc 和 free 之类的函数现在只是已然过去的昨夜噩梦。您连析构函数都不需要调用。仅此足矣。

11、Ruby 是脚本语言。 不要以为 Ruby 是脚本语言所以就不强大。Ruby 可不是玩具。Ruby 是全功能的程序设计语言,只不过 Ruby 让传统的脚本操作变得更容易撰写,比如运行外部程序、检查系统资源、使用 pipe(管道)、截获输出等等。

12、Ruby 用处多样。 Ruby 可以完成好 Kornshell 能够完成好的事情,也可以完成好 C 语言能够完成好的事情。想快速写一个十行的 hack 程序来完成一次性的任务,或者为遗留代码写个 wrapper 吗?用 Ruby 没问题。想写一个 Web 、CGI,或者棋类游戏吗?用 Ruby 也没问题。

13、Ruby 对线程予以支持。 您可以使用简单的 API 撰写多线程应用程序。是的,即使是在 MS-DOS 上撰写也可以。

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

14、Ruby 是开源的。 想看 Ruby 的源代码了?想提供一个补丁建议了?只管去吧!想与智慧云集、乐于助人、包括语言设计者在内的用户社区进行联络吗?可以的!

15、Ruby 具有直观性(直觉性)。 学习曲线平滑不陡。一旦入了门,您是否就开始“猜测” Ruby 的使用方式了呢?您的猜测通常是正确的(译注:因为 Ruby 很直观,符合了人们惯常期待的方式)。Ruby 致力于符合“最少诧异或惊讶”之原则(Principle of Least Astonishment (or Surprise)). 16、Ruby 具有异常(exception)机制。 同 Java 和 C++ 一样,Ruby 能处理异常。这意味着少与返回代码纠缠,更少的嵌套 if 语句,更少的意大利面式逻辑(spaghetti logic,贬义,指的是复杂混乱的代码设计,比如大量使用GOTO语句等等),更好的错误处理机能。

17、Ruby 有高级的 Array class 。 数组是动态的;您不必像在 Pascal 等语言当中那样在编译期声明数组大小。您不必像在 C/C++/Java 当中那样为数组分配空 间。Ruby 的数组是对象,因此您不必时刻警惕其长度;原则上,您不可能像在 C 语言当中那样“越出数组的长度大限”。想以索引、元素,或者反向处理数组吗?想打印整个数组吗?Ruby 为所有这些事情提供了对应的方法。想把数组当作集合(set)、堆栈(stack),或队列(queue)来对待吗?Ruby 也为此提供了对应的方法。想把数组当作查找表(lookup table)来使用吗?这是个问题问得巧——您不必这样用,因为 Ruby 提供了哈希表专门处理这个问题。

18、Ruby 是可扩展的。 您可以用 Ruby 或者 C 语言编写外部程序库。另外,您还可以随心所欲地就地修改现存的类和对象。

19、Ruby 鼓励 literate programming(字面编程方式)。 您可以将注释嵌入到代码中,Ruby 的文档工具可以从中抽取和操纵这些注释。(Literate programming 的铁杆儿支持者或许会认为这是很基础的东西吧。)

20、Ruby 以创新的方式使用分隔符和大小写。 返回 Boolean(尽管 Ruby 不这样称呼它)的方法通常都以问号结尾,而且,修改数据的方法的名称带有惊叹号。一切都简单、明了、直观。包括 class 名称在内的所有常量都以大写字母开头。所有对象的 attributes 都以 @ 标记开头。这种方案既有老式的“匈牙利表示法(Hungarian notation)”的务实性,又避免了龌龊刺眼的表现形式。

21、Ruby 的保留字不保留。 使用被称为“保留字(reserved word)”的标识符是完全没有问题的,只要保证别让语法分析器遇到歧义的情况就行。这可真是畅快。

22、Ruby 支持迭代器(iterator)。 Ruby 的迭代器使得“传递代码区块到对象中”这种操作可以经由这样的方式来完成,即对于数组、列表(list)、树(tree)等诸多结构中的每一个元素都能够调用指定的代码区块。这是个值得深入探究,威力强大的技巧。

23、Ruby 具有性特性。Ruby 借用了 Perl 的“点缀(tainting)”概念,通过 $SAFE 变量实现

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

了多种控制级别(揪心级别?)。此特性对于“为了攻破 web 而被利用”的 CGI 程序而言,特别有好处。

24、Ruby 没有指针。 类似 Java,并向 C++ 恶狠狠地点了点头,Ruby 中没有“指针(pointer)”概念;不存在间接性,没有指针运算,没有语法和调试指针所带来的头疼困扰。当然,这意味着真正底层的系统编程变得困难了 一些,比如访问某设备的控制状态寄存器;但这些系统级事务总是可以利用 C 程序库来完成。(正如 C 程序员会在必要时使用汇编一样,Ruby 程序员会在必要时使用 C 语言!) 25、Ruby 关注细节。 Ruby 提供丰富的同义词和别名。不记得对数组或字符串是用 size 还是 length 吗?两个都可以用。对于范围(range),是用 begin 和 end ,还是 first 和 last?由您自选。您心里拼写 indices ,而您的手却拼出 indexes 吗?两个都可以用。

26、Ruby 具有灵活的语法特性。 在方法调用中可以忽略括号,参数之间可以忽略逗号。Perl 风格的引号允许我们定义数组或字符串时不必劳烦去敲那些引号和逗号(译注:Ruby 中 a = [ 'ant', 'bee', 'cat' ] 可以简写为 a = %w{ ant bee cat })。return 关键字也可以忽略。

27、Ruby 有丰富的程序库可供使用。 Ruby 的程序库提供了对线程、套接字(socket)、有限的对象永续机制、CGI、服务器端可执行机制、DB 文件等许多功能的支持。Ruby 还对 Tk 有所支持,今后会有更多的支持。

28、Ruby 有调试器(debugger)。 在完美世界里我们大约不需要调试器。可惜这并不是完美的世界。

29、Ruby 可通过交互的方式来使用。 Ruby 设计为可以将其当作一种类似 Kornshell 的 shell 来使用。(这是本文中最令人质疑的观点,而且我也不得不承认,Ruby 并不是真正非常优秀的 shell。但我还是坚持认为,基于 Ruby 的 shell 是个不错的东西。)

30、Ruby 是精炼的语言。 Ruby 中没有非必要的关键字,比如 Pascal 的 begin,if 之后的 then,while 之后的 do。不需要事先声明变量,因为变量无类型。不需要为方法指定返回类型。不需要 return 关键字;方法会返回最后被求值的表达式之结果。另外一方面……Ruby 不像 C 或 Perl 那么晦涩。

31、Ruby 是面向表达的语言(expression-oriented)。 您可以像说话一样很容易写出 x = if a<0 b c end else then> 这样的句子。

32、Ruby 语言中系结了 syntax sugar(语法糖)。 (转述 Mary Poppins 的话说就是:一勺语法糖可以压一压语义的药味。"A spoonful of syntax sugar helps the semantic medicine go down.")只要您想,您就可以用 for a in x 来迭代遍历数组 x,可以用 a += b 来代替 a = a + b。大多数操作符其实只是简化的方法表示、更加直觉的名称以及更加方便使用的语法形式。

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

译注:Mary Poppins 指的是美国1964年拍摄的经典电影《欢乐满人间(Mary Poppins)》。 33、Ruby 支持操作符重载(overloading)。 如果我没记错的话,操作符重载源起自很久以前的 SNOBOL,但却是由较近的 C++ 振兴。这个机制可能会被滥用或误用,但有总比没有好。另外,Ruby 会自动定义操作符的赋值(assignment)版本,比如说,您定义了操作符 + ,那么您就会自动得到操作符 +=。

34、Ruby 具有无限精度的整数算法。 谁还关心 short、int、long 呢? 使用 Bignum 就行了。承认吧,您总还是想看看365的阶乘是多少。现在您可以看了。

35、Ruby 具有幂运算操作符。 在过去年代,我们在 BASIC 和 FORTRAN 里使用过幂运算操作符。但是后来我们学会了 Pascal 和 C 语言,知道了这个操作符邪恶的一面。(我们被告知,我们甚至都不曾知道求值是如何完成的——是使用了对数还是迭代?效率有多高?)可是我们真的关心这些 么?如果是,我们可以编写自己的版本。如果不是,Ruby 还提供了您珍爱的老好用的 ** operator 供您使用。享用它吧!

36、Ruby 具有强大的字符串处理能力。 如果您想对字符串进行搜索、替换、修改、格式化、截断(trim)、分隔(delimit)、追加(interpose),或者字元化(tokenize)等操作,您可以使用 Ruby 内建的方法。如过内建方法不能满足要求,您可以利用内建方法来建构自己所需。

37、Ruby 几乎没有违反自身规则的例外情况。 Ruby 的语法和语义比大多数语言更具自我完备性(self-consistent)。每种语言都有犄角旮旯,每种规则都有例外情况;但 Ruby 的旮旯和例外可能比您想象的要少。

寻求帮助

用ri命令 ,如ri Array,ri Kernel.print等等

变量

变量的赋值:类似C语言

操作符:+,-,*,/,%取余,**指数,操作符加赋值符,如+=,-=等#=>

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

语句

条件语句

if...then...end,if...end,if...elsif...else...end,unless... ...else...end 三元操作符 ?: case语句

case(表达式)

when值:执行 when值:执行 …

else 执行 end

循环语句

while 表达式 do语句 end; begin...end while 表达式; until...do...end,

loop do ...end,Kernel中的方法, for ...in...do...end break中断循环

n.times{...},Interger类中的方法

1.upto(n){|i|...},Interger,String,Data类中的方法 n.downto(1){|i|...},Interger,String,Data类中的方法

异常处理

数据结构

字符串

:以一对双引号定义(推荐方式)

字符串基本操作

定义:1.用单双引号,例strname=”内容”,双引号会转义字符,单引号不会 2.用strname=String.new(“内容”) 3.strname=String(“内容“)

4.strname=%分界字符1内容 (分界字符2),分界字符有成对的:!【{,

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

不成对的 %Q双引号,%q单引号,%x重音符,用于指令输出

常用方法:strname.empty,strname.length,strname.empty 连接字符串:+,<<

访问字符串:【num】,【‘子字符串’】,截取字符串【偏移量,字符长度】,【num1...num2】,正则表达式

字符串比较:==,strname.eql?

字符串操作:strname*ntimes, strname.insert num,”插入内容”, []= chomp(!)方法:摘除行尾的记录分割符,返回nil或被改变后的字符串 chop(!)方法:去掉字符串的最后一个字符

delete方法:^例外符,否定参数中的全部字符串或部分字符串的意义 gsub(!)方法:gsub oldstr,newstr reserse(!)方法:反转字符串

split方法:把字符串转换成数组,strname.split(/分割符/),没有分割符时,每个字符是数组中的一个元素

capitalize(!)方法:首字母大写 downcase方法:全小写 upcase方法:全大写

遍历字符串:1.strname.each_byte{|i|...},2.str.each{|i|...} 处理字符串空白:

1.左右和中心对齐,即加入空白

a)strname.ljust num,strname.rjust num,strname.center num num>strname.size才会对字符串有影响 b)strname.ljust(num,”symbol”),

num>strname.size时,用symbol补齐,rjust和center方法相同 2.清除空白回车换行等

strname.lstrip(!),strname.rstrip(!),strname.strip(!) 递增字符串

数字 英文字母或字符集里的其他字符(默认处理的字符集为ASCII) strname.next(!),strname.succ(!),charname.chr, strname.upto(“...”),例如”a”.upto(“z”){|i|...} 转换字符串

strname.to_f,strname.to_i,strname.intern,strname.to_sym, othertype.to_str

正则表达式

strname.gerp (/.../)

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

数组

:以一对中括号定义

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

比较数组

==,<=>,eql?

数组表现为字符串

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

删除元

素数据和语句块数组排

序和外观

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

哈希

:以一对大括号定义

遍历哈希内容

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

哈希合并

hash1.merge hash2,如果hash2中和hash1有相同键,采用hash2的值。

hash1.merge (hash2){|key,old,new| new=old+”_new”}使用merge时加入语句块哈希排序

hash.sort,无法直接改变hash对象

替换哈希

conties.replace({“Dalaware”=>3})将conties的内容替换检查哈希表

Hash.new,Hash.empty,Hash.length,Hash.size

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

程序结构

方法

提供一种收集程序(语句与表达式)的方式,可复用def method_name(参数,...)...end 解除方法定义 undef method_name返回值:return语句;

puts method_name;

变量=method_name;puts变量;方法的命名惯例:以?结尾,返回ture或false;

以!结尾,方法具有破坏性,对对象本身,而非对象的副本做出改变 以=结尾,方法可能用来赋值或设置像类中的实例变量这样的变量方法可以有默认值。

方法可以有可变数目的参数,在参数前加上*,可变参数必须在所有参数的最后面别名 alias method_name method_othername

语句块

匿名函数,通常与某个方法相结合,通常是从数据结构中取得所有值的惯用方式 yeild执行程序语句块,传递给方法

闭包:匿名函数或方法,能引用外围方法的变量,或共享这些变量,以{}或do...end,并且要有相关相配合的方法才能执行

Proc

ruby能把Proc存储为对象,包括执行的环境,调用Kernel模块的lambda或proc(会检查参数),或者利用proc类的new方法(不会检查参数)控制结构BEGIN和END

分别在程序执行前和执行后,各执行一小段源代码BEGIN{...},END{...}

元编程

是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在编译时完成部分本应在运行时完成的工作。很多情况下比 手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射。

单继承:继承对象只限一个类,避免多继承的名字冲突问题。继承符号:<

模块 :单继承和多继承的妥协机制度,模块中可定义变量,常量和方法,但必须被类引用,才能运用模块内容,模块名称必须为常量(首字母大写或全部大写),module MODULE_NAME...end

覆盖方法:名称冲突时,以最新定义为准。

类的开放性:Ruby的类总是处于开放状态,可以增添内容,内建类里也可添加方法或其他内容。

定义类:class classname...end

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

实例变量:能从对象实例里取用的变量,属于某个对象。字首为@

类变量:可由类的所有实例共享,一个类里,每个类变量只有一份正本,字首为@@,在使用前,必须 先初始化一个类属性

类方法:是与类相关联的方法(在Ruby中与模块相同)。在方法名称前加上它所属的类名称,即可调用类方法,类方法也称为静态方法单体类:在类里使用的另一个类(单体类)

继承:respond_to?确认子类实例能否取用父类方法,父类位于其他文件,需先引用文件require 'load path'

public,private,protected:与C++同,默认为public,可见度public>protected>private

Object类:引用了Kernel模块,常用的Kernel方法:eval exit gets loop require sllp sprinf

反射机制

转载

2011-07-15 15:51 10人阅读 (0)

概括、ruby程序由一个或多个ruby源文件组成,源文件由模块组成,模块内部有控制结构、类对象、方法、及表达式等元素,下面就按照这个思路来总结ruby的程序组织结构。一、源文件1.1、文件包含1.#file1.rb

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

2.inc_path=$0.sub(/\/\w+\.rb/,"") #获取当前路径的目录 3.$:.insert(-1,inc_path) #将当前路径加入到load路径数组 4.

5.require "file2.rb"

6.require "file2.rb" #require包含文件只会被导入一次 7.

8.load "file3.rb"

9.load "file3.rb" #每次load都会无条件再次导入文件 10. 11. 12.#file2.rb 13.print "file2.rb is included\n" 14. 15. 16.#file3.rb 17.print "file3 is included\n" 1.2、源文件执行顺序1.#coding=utf-8 2.=begin 3.这里是 4.多行注释 5.=end 6.

7.END{print "end1\n"} 8.END{print "end2\n"}

9.#END块的执行顺序与出现顺序相反 10. 11.print "text\n" 12. 13.BEGIN{print "begin1\n"} 14.BEGIN{print "begin2\n"} 15.#BEGIN块的执行顺序与出现顺序相同 16.#BEGIN-TEXT-END 17. 18.#__END__开头的行后面的内容被忽略 19.__END__ 20.print "no_text\n" 1.3、源文件书写规则 ◆大小写敏感

◆换行符后只能有空白符,并且都会被忽略

◆类和模块及常量名要以大写字母开头,变量以小写字母或者unicode开头二、模块1.#module1.rb

2.inc_path=$0.sub(/\/\w+\.rb/,"") #获取当前路径的目录

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

3.$:.insert(-1,inc_path) #将当前路径加入到load路径数组 4.

5.require "module2.rb" 6.

7.print Mymod::VAR1,"\n" 8.Mymod.out 9. 10.include Mymod #把Mymod导入到当前名字空间 11.print VAR1 12. 13. 14.#module2.rb 15.print "module2.rb is included\n" 16. 17.module Mymod 18. var1=99 #模块内的变量 19. VAR1=100 #模块内的常量 20. 21. print "Mymode is included,var1 is ",var1,"\n" 22. 23. def Mymod.out #模块内的方法必须加上模块名 24. print "Mymod.out run\n" 25. end 26.end 三、控制结构

ruby的控制结构和其他语言一样无非就是顺序,分支及循环,但写法上相当的灵活。3.1、分支结构之if1.#if.rb

2.num=100

3.if (num>200) #可以用unless进行条件取反 4. print "num>200\n"

5.elsif num>100 #if和elsif和后面的代码块必须有换行符或者分号或者then来隔离,else不需要

6. print "num>100\n" 7.else

8. print "num<=100\n" #此句执行 9.end 10. 11.print "num<=100\n" if num<=100 #if语句可后置 12.puts (if num==100;"100";end) #if语句也是表达式所以有返回值 3.2、分支结构之case1.num=100 2. 3.str1= 4.case

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

5. when num>200 then "num>200" 6. when num>100 then "num>100" 7. else "num<=100" #else不使用then 8.end 9. 10.print str1,"\n" 11. 12. 13.case num 14. when 201 then print "num>200" 15. print 101 when num>100 16. else print "num<=100" 17.end 3.3、循环结构1.num=1 2.

3.while num<5 #反义词until ,和code的分隔符可以是换行符或者分号或者是关键字do

4. print num 5. num+=1 6.end 7.

8.print "\n" 9. 10.arr1=[1,2,3,4,5] 11. 12.for i in arr1 13. print i 14.end 15. 16. 17.num=1 18.loop{ #注意{必须和loop在同一行 19. num+=1 20. next if num==3 #不输出3 21. redo if num==4 #把循环体内此行的前面的语句再执行一遍 22. break if num>5 #大于5则退出循环 23. print num 24.} 25.#输出25 26.#while,until,for也可用next,redo,break 3.4、for..in结构

可以对可迭代对象也就是有each方法的对象使用for..in。1.hash1={:first=>1,:second=>2,:third=>3}

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

2.

3.for key,value in hash1 4. print key," ",value,"\n" 5.end 3.5、异常处理1.begin #raise产生异常 2. 1/0

3.rescue Exception=>ex #给异常起别名 4. puts ex.class,ex.message 5.else

6. puts "no exception"

7.ensure #无论有没有异常必须执行的语句 8. puts "must run!" 9.end 3.6、控制结构补充 1.print "0 is true!" #0也是true

2.print "empty string is true!" #""也是true 3.#在ruby中只有nil被判断是false 四、方法定义

ruby中的方法支持默认参数,可变参数但不支持关键字参数,可以通过传入散列表来模拟实现,方法的最后一句的执行结果就是其返回值。4.1、一般方法1.def non_para

2. puts "this is non_para method" 3.end 4.

5.def many_para(para1,hash_para,default_para2=2,*dynamic_para3) 6. puts "first para is ",para1 7. puts "hash para is below:"

8. hash_para.each_key{|key|print key,"\t",hash_para[key],"\n"} 9. puts "default_para is ",default_para2 10. puts "dynamic para is below:" 11. for i in dynamic_para3 12. print i,"," 13. end 14.end 15.#默认参数和可变参数必须是最后的两个参数 16. 17.non_para() 18.many_para(1,{:first=>1,:second=>2},3,5,7,9)

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

4.2、方法的作用范围

ruby根据方法名来确定方法的作用范围,这样做增加了程序的阅读性。1.#coding=utf-8 2.

3.str1="abcdefg" 4.

5.def str1.len #对象的方法 6. puts self.length 7.end 8.

9.str1.len 10. 11.class Person 12. def #类的方法即静态方法 13. puts "this is a perosn" 14. end 15.end 16. 4.3、BLOCK

与方法关联的BLOCK为方法提供了可扩展性。可以把方法中的一部分逻辑抽象成BLOCK独立出来,和子程序调用所不同的是,BLOCK是灵活的,也就是说我可以只完成方法的主干部分,有一些逻辑可以根据需要在调用方法时进行扩展。1.def func para1

2. localvalue="local value" 3. yield(para1) 4.end 5.

6.func(100){|para1|print "value of para1 is ",para1,"\n"} 7.

8.func(100)do 9.|para1| 10.print "double value of para1 is",para1*2,"\n" 11.#print local_value 局部变量已不能被继承 12.end 13.#yield最后一条语句执行结果就是给方法的返回值。 4.4、方法补充

◆可以undef 方法名取消方法的定义

◆alias 方法名 方法别名 可以为方法定义不同的名字 ◆&方法 得到方法的引用,调用时采用 方法引用.call的方式五、类及对象

按照传统编程语言学习顺序 历史特性-》变量-》语句-》数据结构-》程序结构的顺序撰写,是笔者自己学习ruby时的知识总结。主要参考资料有《learning ruby>等。

5.1、普通的类定义如下1.class Person

2. def initialize(name,age)

3. @name=name #类属性必须在类方法中定义 4. @age=age 5. end

6. def name#属性不能直接被访问,必须通过方法接口进行访问 7. @name 8. end 9. def age 10. @age 11. end 12.end 13. 14.p1=Person.new("justsong",28)#会用相同的参数调用initialize 15.print ,"\n",p1.age 5.2、类中方法的访问权限默认为public,ruby有和c++类似的权限声明方式。1.class Person

2. def initialize(name,age)#属性在initialize中定义 3. @name=name 4. @age=age 5. end

6. def name#属性不能直接被访问,必须通过方法接口进行访问 7. @name 8. end

9.private#protected,public 10. def age 11. @age 12. end 13.end 14. 15.p1=Person.new("justsong",28)#会用相同的参数调用initialize 16.print ,"\n" 17.#print p1.age,private调用将被禁止 5.3、由于属性必须通过方法接口进行访问,所以在书写程序时有些繁琐,可以采用一下的方法进行简写。1.class Person

2. attr_reader :name #具有只读权限 3. attr_writer :age #具有只写权限

4. attr_accessor :country #具有读写权限 5. def initialize(name,age,country) 6. @name=name 7. @age=age

本文来源:https://www.bwwdw.com/article/vks4.html

Top