C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。
C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回_nop_: 相当于插入NOP_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。_chkfloat_: 测试并返回源点数状态。使用时,必须包含#inclucle 一行。如不说明,下面谈到的库函数均指非本征库函数。
例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。
该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。
流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。
如程序有误修改源代码后不必再translate或link了,只要一步Amake即可。若project中包括不止一个文件,在DOS的Ishell中不能用Translate编译,而应建立bat文件,直接在命令窗编译,然后link连接。如还需用Translate则只能多个文件分别编译,然后连接。
C51程序编译生成汇编代码的效率,是由许多因素共同决定的,对于Keil C51,主要受以下两种因素影响:
存储模式决定了缺省变量的存储空间,而访问各空间变量的汇编代码的繁简程度决定了代码率的高低。例如:一个整形变量i,如放于内存18H、19H空间,则++i的操作编译成四条语句:INC 0x19MOV A,0x19JNZ 0x272DINC 0x180x272D:而如果放于外存空间0000H、0001H则++i的操作编译成九条语句:MOV DPTR,A就汇编之后的语句而言,对外部存储器的操作较内部存储器操作代码率要低得多,生成的语句为内存的两倍以上,而程序中有大量的这种操作,可见存储模式对代码率的响了。因此程序设计的原则是1、存储模式从small-Compact-large依次选择,实在是变量太多,才选large模式。2、即使选择了large模式,对一些常用的局部的或者可放于内存中的变量,***放于内存中,以尽量提高程序的代码率。
程序的结构单元包括模块、函数等等。同样的功能,如果结构越复杂,其所涉及的操作、变量、功能模块函数等就越多,较之结构性好,代码简单的程序其代码率自然就低得多。此外程序的运行控制语句,也是影响代码率的关键因素,例如:switch -case语句,许多编译器都把它们译得非常复杂,Keil C51也不例外,相对较为简易的Switch-case语句,编译成跳转指令形式,代码率较高,但对较为复杂的Switch-Case,则要调用一个系统库函数?C?ICASE进行处理,非常复杂。再如if( ),while( ),等语句也是代码相对较低的语句,但编译以后比switch-case要高得多。因此建议设计者尽量少用switch-case之类语句来控制程序结构,以提高代码率。除以上两点外,其它因素也会对代码率产生影响,例如:是否用寄存器传递参数 即NOAREGS选项是否有是否包括调试信息:即DEBUG选项是否包括扩展的调试信息:即BJECTEXTEND
可设置其它各种调试窗口,设置断点、观察点,修改地址空间,加载文件等等;
支持用户程序的各种显示方式,可连续运行,单步运行用户程序,并可在线 汇编;
可设置所要观察的变量、表达式等;
显示内部寄存器的内容,程序运行次数等;
显示串口接收和发送的数据;
显示所要观察的各程序段占用CPU的空间;
显示所选择的内存中的数据;
显示各种符号名称,包括专有符号,用户自定义符号(函数名、变量、标号)等;
动态显示当前执行的程序段的函数调用关系;
提供当前模块内各程序段中被执行代码的比率;。
可显示I/O口,定时器,中断,串口等外围设备状态;
在装入8051.dll后,在dScope的主菜单中将增加Peripherial,其有4个字菜单:I/0 port:Pi端口状态Interrupt:中断设置Timer:定时器中断状态Serial:串口中断状态设置相应的中断请求标志位即可产生中断。
PA用来分析一段代码执行占用CPU的百分比。定义:命令行 PA func_name
dScope除了用命令行的方式进行调试以外,还可将各种调试命令汇集于一个调试文件中,然后调用该文件,就可达到自动测试用户源代码的目的。dScope的命令文件支持C/PL/M的格式,因而编制调试命令文件与编制C语言程序有些类似。
C:代码空间D:内部直接寻址空间I: 内部间接寻址空间X:外部数据空间B:位寻址空间P:I/O口EB:扩展的位寻址空间(MCS251专有)ED:扩展的数据空间(MCS251专有)CO:常数空间(MCS251专有)HC:正常数空间(MCS251专有)
dScope支持十六进制、八进制、十进制、二进制常数,其后缀分别为H、Q(O)、T(或无)、Y;dScope不区分常量的大、小写。
分为整型(int),无符号整型(uint,00rd),长整型(long),无符号长整型(Wlong、Word)。
分为字符型(Char)和无符号字符型(Uchar)一种。
指用户程序中的行号,实际上是个地址
地址常数的种类很多,地址常数不同于行号常数,行号常数就是一个地址,而地址数被引用时,实际上是取该地址中的数据。C:代码地址常数,如C:0X0012或0XFF:0X0012D:内部直接寻址地址常数,如D:0X0068或0X00:0X0068I:内部间按寻址地址常数,如I:0X0010或0X00:0X0010X:外部数据空间地址常数,如X:0X0028或0X01:0X0028B:位地址常数,如B:0X20或B:0X24.0EB:扩展的位地址常数(MCS251专有), ED:扩展的数据空间地址常数(MCS251专有)CO:常数空间地址常数(MCS251专有)HC:正常数空间地址常数(MCS251专有)
即用户源程序中的标号、函数名等,实际上代表某一地址。
dScope所支持的变量名或标识符最多可由31个字符组成,第一个字母为A~Z,a~z,下划线或问号,后续字符可为字母、数字、下划线和问号。除CPU变量和系统变量外,dScope不支持全局变量,但可视“define”命令定义的变量为全局变量。Dscope所, 支持的变量分为以下几种(变量名称不区分大、小写),支持类型转换:
分为整型变量(int)、无符号整型变量(uint/word),长整型(Long) 、无符号长整型(Ulong/dword)。
分为字符型(char)变量和无符号字符型(Uchar)
即R0~R7、A、C(位变量)、B、DPTR及特殊功能寄存器变量,对这些变量均可进行读、写操作。
dScope支持ANSI C的运算符,包括算术运算符,逻辑运算符,关系运算符。
以运算符将dScope所支持的常量、变量、函数等连接在一起,就构成了dScope的表达式。
dScope不支持在命令文件中定义数组,但可引用用户程序中的数组,引用方式如同C。
dScope不支持在命令文件中定义结构和联合,但可引用用户程序中的结构和联合,引用方式如同C,但如要输出整个结构或联合的结果,就要用命令“OBJ”。
不可自定义指针,但支持用户源程序中的指针变量。
dScope提供了一系列调试命令。在命令文件中,dScope只支持这些语句及前述定义的表达式,C语言的语句均不被支持,但在命令文件所包含的用户自定义函数(非用户源程序中的函数)中支持C语句,但用户自定义函数中同样不支持数组、结构、联合和指针。
用户自定义变量指令,格式如下:Define <类型> <变量名>类型一为如前所述的变量类型,Define指令定义的变量可能为全局变量,可为用户自定义函数所引用。
内存显示命令,格式如下二:D 起始地址,结束地址地址如前所述的地址常数,标识符常量。
内存修改指令,格式如下:E 类型地址=表达式 [表达式2],[……]类型如前所述,地址如前所述的地址常数。表达式如前所述,但如果是函数名称(含标号、指针变量),则关键字E→EP
Map为内存段修改指令,Reset map将内存段复位或缺省值。
用以引用用户源程序中的结构(联合)、数组、格式如下:Obj表达式 [n,],[Line]表达式为用户源程序中的数组,结构(联合)名称。当Line缺省时,数目、结构(联合)的内容按n行输出;如有Line,则单行输出。
反汇编命令,格式如下: U [地址]地址包括地址常 数及标识符常量,指明反汇编的起始地址。
观察点设置命令,格式如下:WS 表达式[,n][LINE]关键字LINE存在时,观察点表达式单行输出LINE缺省时,观察点表达式n行输出。
连续运行命令,格式如下: G [起始地址],[终止地址]地址为标识符常量或地址常数,地址缺省时,为连续运行。
性能分析操作指令,其分以下几种:PA显示当前所设置的性能分析程度段PA Kill *删除当前所设置的所有性能分析程序段PA Kill n1 [,n2],[……]删除指定的性能分析程序段PA 地址范围设置性能分析程序段,地址范围可以起始地址和结束地址的方式给出,也可给出函数名,行号范围。PA Reset复位性能分析窗口(PA Windows),清除所有的记录。
断点显示指令,显示所有被定义的断点。
图标定义指令,用于当窗口(Toolbox)
DOS窗口Open命令,以“EXIT”命令退出DOS窗口。
文件包含命令,格式如下:Include [路径] 文件名dScope支持以文件包含的方式调入并执行调试命令文件,用户自定义函数文件,调试命令文件可以有后缀,也可无后缀。
完成输出操作并开闭该文件LOG指令只将LOG>或LOG>>与LOG OFF指令之间的操作命令存入该指定文件。
该指令将一段内存映象以19EX386/HEX的格式存盘,具体格式如下:Save 路径 文件名:地址1、地址2地址1、地址2指所要保存的空间范围,既可是标识符,也可是址常数。
变量=“字符串”SET 变量
dScope支持三种函数,即dScope预定义函数,用户自定义函数和信号函数,分别详述如下:
用于产生一个信号波形,该函数必须用于信号函数中。
这类函数不同于用户源程序中的数函,其定义格式为Func 返回类型 函数名(参数序列) { 语句}返回类型如前所述的变量类型用户自定义函数中的语句与ANSI C相似,只是不支持数组结构、联合、指针,可引用dScope系统变量,define语句定义的变量和用户源程序变量,不支持dScope命令,如想在函数中执行dScope命令,要借助于exec(“Command__String”)函数,可引用dScope预定义的函数(除了twatch ( )函数),不支持ANSI C的库函数。
① 不支持条件汇编② 不支持头文件③ 无变量的初始化④ 不支持数组、结构、指针⑤ 调用方式不同,自定义函数和信号函数首先要包含一个函数文件之中,然而在测试命令文件中以Inclule指令调用该函数文件,最后才能以函数名调用之。⑥ 函数调用只支持传值方式。
1、以下由while构成的循环执行的次数是
B、有语法错,不能执行
2、以下程序的输出结果是
3、以下程序段的输出结果是
4、以下程序的输出结果是
5、以下程序的输出结果是
6、下面程序运行时从键盘输入3.6 2.4,则输出结果是
在本教程中,将探讨使用Ruby开始编程所需的基本语法,以及如何在30分钟内学习并使用Ruby编程语言。
注:如果您还尚未安装Ruby开发环境,请访问环境设置页面并按照说明安装:
Ruby被许多人认为是一种“新”编程语言,但实际上是由一个叫作Matz的开发人员于1994年发布的。 Matz自我描述是一个“语言极客”,也是Perl大粉丝。 他对Ruby的想法是创建一种像Perl这样灵活而强大的语言,但在其语法上更具表现力 - 甚至可以具有类似于英语那样的可读性。
Ruby在日本迅速成长,直到2000年,真的没有关于除了日本语言以外的任何文档。所以如果想要学习Ruby,那得必须先学习日语。 敏捷编程的先驱Dave Thomas被Ruby迷住,并决定创建Ruby的其它语言文档。
自Ruby有了英文开始,Ruby就开始在英语世界中增长,尽管缓慢。 系统管理员变得流行,编写维护和“粘贴”脚本 - 类似Perl的用法。从2000年到2005年美国的Ruby社区已达数百个。
在年,一家名为37Signals
的芝加哥公司聘请了一名年轻的开发人员来构建一个Web应用程序。 公司给了他几乎完全的执行自由; 他们只关心客户端的设计和功能。 当时主要的Web技术是Perl CGI,PHP,Java的JSP和Microsoft的ASP。
但是他们都是有点痛苦,但DHH的大卫(DHH)选择了自己的方向。他在Ruby中写了这个应用程序。 他依靠核心库和少数库的帮助下,同时自己创建了整个堆栈(或多或少)。37Signals在Web应用程序使用Ruby来编写,这个项目今天被称为Basecamp
。
当建立了Basecamp,DHH就会从中提取出Web框架。 这是一个非常不同的方法,从Java/Sun
或.NET/Microsoft
,Web框架都是从高处往下传播。 相反,Rails从现实世界中抽出来。 它侧重于常规配置,使常见问题更容易解决。
这种方法是一个很大的打击,Rails自从以来一直推动了Ruby/Rails社区的发展。 现在,在亚马逊上有数十本书,全球近一百个会议,有成千上万的人是Ruby/Rails开发人员。
如果你想学习Rails,需要先学习Ruby! 现在就开始咯 …..
字符串中的字符每个都有一个位置编号,它们从零开始。 所以对于字符串中的开头“Ru”,“R”位置编号为0
,“u
”所在的位置编号为1
。
要在主字符串中提取出一个子串,可指定提取的起始位置和结束位置。 因此,上面的string[0..8]
提取出位置从0
至8
的字母,也就是:“Ruby in 3
”。
Ruby解释负的位置从字符串的末尾返回。所以在上面示例中,结尾的字符串“com
”的字母分别对应为“m
”位于-1
,“o
”位于-2
和 “c
”位于-3
。
所以如果一个字母同时有正数和负数的位置,那么应该使用哪个? 建议使用正数,因为这样它们更容易理解。 但是,如果要基于字符串末尾查找东西(例如“该字符串的最后一个字符是什么?”),则使用负数指定位置。
在IRB中使用字符串(对象)中一些常用的方法。
length
方法用于求出字符串中有多少个字符(包括空格):
尝试:计算你的名字的总长度
有时想要将一个字符串分成几部分。 例如,假设有一个存储为字符串的句子,并将其分解成单词:
.split
方法返回一个数组,这将在后面的部分讲解中了解到。 它默认使用空格(“ ”)字符将字符串分割成多个部分。
但有时要分割的不是一个带有空格的字符。 .split
方法接受一个参数来指定分隔符,看看下面示例就明白了。
在第一次分割的调用中,它尝试使用空格作为分隔符,但字符串中没有分隔符,所以得到一个整个字符串的数组。 在第二次尝试中,指定使用逗号(“,
“)作为分隔符,所以得到一个8
个数字值的数组。
这两种方法可以用来替换字符串的部分。它们就像在文字处理器中使用“查找和替换”。 .sub
替换只发生一次。 而.gsub
全局替换的缩写,替换所有的发生(如“全部替换”)。
对于.sub
和.gsub
,需要指定两个参数:首先是要替换的子字符串,然后再替换要替换的字符串。
将变量的值与字符串相结合这是在开发应用程序中最经常使用的。 例如,现在从下面这个例子开始:
当把上面语句放入IRB
时,它只是打印输出同一个字符串。 如果编写一个应用程序,希望它以用户名而不是“??
”来跟用户打招呼,那么需要怎么做?
需要做的就是将变量与字符串组合。有两种方法可以做到这一点。
方法-1. 字符串连接
第一种方法,可使用字符串连接,它将字符串与加号连接:
在第一行中,设置了一个name
变量来保存名称。 在第二行,打印字符串“Good morning
“ 并结合”name
“变量和字符串”!
“的值。
方法-2. 字符串插值
第二种方法是使用字符串插值,将数据粘贴到字符串的中间。
字符串插值仅适用于双引号字符串。在字符串内使用插值标记#{}
。 在这些括号中可以把任何变量或Ruby代码放入其中,这些变量或Ruby代码将被评估求值,其结果转换为一个字符串,并输出到外部字符串的那个位置。 上面的例子可以这样重写:
如果比较输出结果,就会看到它们输出的是完全相同的结果。 内插样式往往是输入较少的字符类型,较少的双引号打开/关闭,所以可避免加双引号时忘记书写对称(往往有输入多一个,少一个的问题)。
还可以将任何Ruby代码或计算表达式内置在括号内,如下所示:
首先对#{modifier * 3 + mood}
代码块进行评估求值,然后将结果注入外部字符串中。
符号有点难以解释,它们是字符串和数字的一半。但是可以很容易识别一个符号,因为它是以冒号开始一个或多个字母,如:flag
或:best_friend
。
如果你是编程的新手,可将一个符号看作是一个几乎没有任何方法和没有字符串插值的被剥离下来的字符串。 将正确的字符串与类似符号的方法列表进行比较,如下所示:
如果你是一个有经验的程序员,想象一个符号是一个“命名整数”。 符号引用的实际值无关紧要。 我们所关心的是,虚拟机内对该值的任何引用将返回相同的值。 因此,符号在全局符号表中定义,它们的值不能改变。
数字有两种基本类型:整数(整数)和浮点数(有小数点)。
整数对于您和计算机来说都要容易一些。 您可以使用包括+
, -
,/
和*
在内的整数的正常数学运算。 整数有一些方法可以用来做数学相关的事情,过调用5.methods
方法就可看到一些常用的方法。
重复执行指令在其他语言中的常见模式是for
循环,用于重复执行某些指令一定次数。 例如,在JavaScript中可以写:
对于循环是很常见的,但它们的代码不是很容易阅读。 因为Ruby的整数是它们拥有方法的对象。 其中的一个方法:times
是重复执行指令的方法。
以Ruby样式重写上述循环:
在这个例子中,使用times
方法和具体的执行代码块。 在下一节中将讨论块。 但是请先在IRB中运行这个例子,看看结果会是什么。
块是Ruby中经常使用的强大概念。 可将块视为一组捆绑在其他地方使用的指令的方式。
在上一节中有一个使用.times
方法的块用整数表示:
该块以关键字do
开始,以关键字end
结束。 do/end
风格总是可以被Ruby解释器所接受的。
当块仅包含单个指令时,经常使用备用标记{
和}
来标识块的开始和结束:
那么使用块来做什么? 块可以用来作为传递给方法调用的参数。
例如,如果调用了5.times
,Ruby就不会知道要执行五次了。当通过块时,就会说“这里是希望每次运行的说明”。
块中有很多的方法。 就像前面看到的.gsub
方法一样,字符串早就为每个匹配运行一个块:
请注意,”Found an E!
“显示了三次,因为字符串中有三个E
字母。
通常,在块内指示需要引用正在使用的值。 当在编写块代码时,可以在管道字符中指定一个块参数:
什么值应该放入该块参数,这取决于要调用的方法。 在本示例中,times
方法放入当前运行的数值。尝试上面的块,观察输出,然后尝试这样修改:
上面代码输出结果如下 -
而.gsub
在找到的字符串中传递。 尝试这个(用括号表示法):
在上面结果中看到gsub
正在使用块的结果作为原始匹配的替换。
通常当编写程序时,我们需要处理数据的集合。先来看看最常见的数据集合 - 数组。
数组是数字索引列表。 想象一下,有一张空白的纸,画了三个小盒子:
可以按照从左到右对每一个位置进行编号:
然后在每个框中放入字符串(或其它值):
现在变成一个有三元素的数组。 Ruby数组的大小可以增长和缩小,所以如果添加一个元素,它通常会在结束位置添加,索引值也会变递增1
:
请注意,最后一个元素的位置总是比元素的数量小1
。
数组中在索引为2
位置对应的数据值为“Dinner
”。最后一个元素对应的数据值为“Dessert
”。
以下是Ruby代码中相同建模的方法:
在上面代码运行结果中,观察到…
该数组是通过将数据片段放在方括号([]
)之间并用逗号分隔来创建的。
通过使用“铲子运算符”(<<
)添加一个元素到数组的末尾
通过使用方括号([]
)在指定索引位置来获取元素
数组中一些方便的方法,如.last
数组有很多很酷的东西。 以下是几个例子:
sort
方法将返回一个新的数组,其中元素是已经被排序过了。 如果元素是字符串,它们将以字母顺序返回。 如果它们是数字,它们将按升值顺序回来。尝试下面示例:
可以使用sort
方法重新排列元素的顺序。使用each
方法遍历每个元素。使用join
方法将它们一起混合成一个字符串。使用index
方法找到特定元素的地址。可以使用include?
方法询问数组是否包含指定的元素。
使用数组只要需要一个列表,其中元素是以特定的顺序排序的。
在数组上尝试下面这些常见的方法:
可以参考这个文档了解更多详细信息:
哈希是数据的集合,哈希中的数据的每个元素是按名称来寻址。作为一个比喻,想一下冰箱。 如果要跟踪放在冰箱内的东西,我们并不关心它的放在哪里 - 顺序并不重要。
相反只是按名称去组织这些东西。如名称“apples
”可能具有值3
,则名称“oranges
”可能具有值1
,并且“carrots
”值为12
。 在本示例中,就可使用哈希。
哈希是无序的集合,其中数据被组织成“键/值对”。 哈希的语法更复杂,需要一些习惯:
键用作为地址,值是该地址的数据。 在produce
哈希中有包括“apples
”和“oranges
”的键,其值分别为12
和3
。当创建哈希时,键和值使用=>
符号链接。
所以哈希从一个大括号{
开始,(由一个键,一个=>
标识符和一个由逗号分隔的值组成的零个或多个条目,然后以一个关闭的大括号}
结束。
在这些说明的第一行中,向哈希添加了一个新值。 由于“grapes”键不在原始哈希中,所以它的值为221
。 哈希中的键必须是唯一的,所以当对product [“oranges”]
使用相同的语法时,它会看到键“oranges
”已经在列表中,并且用6
替换值。keys
和 values
方法会列出所有键和值。
通常会使用符号作为哈希的键。 当所有的键都是符号时,可以使用一个速记语法:
请注意,键以冒号结尾,而不是以冒号开始,即使这些是符号。 这个简化的语法能在Ruby 1.9
及更高版本配合使用。要了解正在使用的是哪个版本的Ruby,可在控制台中输入“ruby -v
”。
条件语句评估求值结果为true
或false
。 最常见的条件运算符是==
(相等),>
(大于),>=
(大于或等于),<
(小于)和<=
(小于或等于)。
一些对象也有返回true
或false
的方法,因此它们在条件语句中使用。 例如,每个对象都有方法.nil?
只有当对象为nil
时才返回:true
。 数组有一个名称为.include
的方法
如果数组包含指定的元素,则返回true
。 Ruby中的约定方法名称以?
结尾返回true
或false
。
为什么要有条件语句? 最常见的是控制条件指令,特别是:if
/elsif
/else
结构。在IRB中添加一个这样的方法来写一个例子:
当minutes
值为8
时,执行结果是什么?因为minutes
值等于8
,所以打印出来的结果为:“It's boiling!
”
当minutes
值为9
时,执行结果是什么?因为minutes = 9
,它比较了前面的几个值:5
,7
,8
,但是都没有匹配项,所以最后执行到else
语句块中,打印出来的结果为:“Hot!
if
语句有以下可能的结构:
if
语句的指令只有在语句为真时执行。
if
语句后面可有零或多个elsif
语句,其指令仅在语句为真时执行
if
语句后面零或一个else
语句,如果没有一个if
或elsif
语句为真,则执行else
语句中的指令。
if
/else if
/else
结构中只能在一个部分可以运行它的指令。例如,如果if
是真的,Ruby将永远不会执行elseif
或else
,也就是说永远只执行其中一块。
编写条件语句时遇到常见错误是书写=
和==
,以及它们的区别。
=
符号表示赋值。表示“拿右边的东西,把它粘在左边的任何东西”
==
表示为这是一个问题。表示“右边的东西是等于左边的东西吗?”
还可以使用逻辑运算符组合条件语句。 最常见的是“逻辑与”和“逻辑或”。 在Ruby中,您可以使用这样的双符号(&&
)来书写表示一个“逻辑和”。可以用这样的双管道(||
)书写表示一个“逻辑或”。
什么是虚无? 当我们表达一个东西,没有确定它是什么东西的暂时可以叫它为:虚无,不是没有什么东西吗? 好的,这太多哲学了,这有确实点难解释了。
nil
是Ruby中用于表达“虚无”的方式。
如果有三个鸡蛋,您吃三个鸡蛋,那么可能认为现在您“没有什么”蛋了,但是在鸡蛋方面有“0
”个。0
是什么?它是一个数字,它并不是“虚无”。
如果使用一个单词,如“hello
”这样的字符串,那么删除“h
”,“e
”,“l
”和“o
”,你可能会认为没有什么,但是现在真的有“”
,它是一个空字符串,并不是“虚无”。
nil
是Ruby的虚无的想法的表示。 当要求不存在的东西时,通常会遇到这种情况。 例如,当查看数组时,创建了一个包含五个元素的列表,然后要获取列表中添加第六个元素。但是没有第六个元素,所以Ruby给了nil
。
在第六个元素的地方它并不是空白(“”
),也不是数字0
,它是空/nil
。
编写Ruby代码时遇到的大部分错误是涉及nil
值的。以为某个位置有数据值,试图使用使用这个数据值去做一些事情,但没有这样的数据值,不能做任何事情,所以Ruby引发了一个错误。
Ruby是一种面向对象的编程语言,在与VM内部交互的所有东西都是对象。 每条数据都是一个对象。 对象保存的信息称为属性,可以执行对象的方法。
作为一个对象的例子,想像你是一个人。 你有像高度,重量和眼睛颜色的属性。 你有“走路”,“跑步”,“洗碗”和“白日梦”的方法。不同类型的对象具有不同的属性和方法。 在接下来的章节中,将介绍一些Ruby中常见的特定类型的对象。
在面向对象编程中,我们定义了类,它们是类别或类型的东西的抽象描述。 它定义了该类型的所有对象的属性和方法。
它可以定义一个用于学生自我介绍的方法:introduction
。
尝试在IRB编写上面代码:
attr_accessor
方法是用于定义类的实例的属性。
Student
类本身不代表学生,这是学生信息表示模型。 要表示一个实际的学生,需要创建一个Student
类的实例。
想像你就是一个学生,不是一个抽象的概念,因为你是一个实际的人。这个实际的人是Student
类的一个实例 - 它是一个抽象思想的实现。一个实际的人具有属性:first_name
,last_name
和 primary_phone_number
的实际数据(比如:你的first_name
是“爱华
”,last_name
是“李
”等等)。
一般情况下,很少在IRB
中定义类。这是因为IRB
只是一个便签本(不能很好的保存代码),记得吗? 下面来看看如何从文件中运行Ruby。
F:\worksp\ruby
)
student.rb
的文件。
由于这个文件是空的,所以不应该得到任何输出。
在文本编辑器中,开始编写类的结构:
在类的内部,通常使用def
关键字定义一个或多个方法,如下:
请注意,puts
行正在计算求值一个名为first_name
的方法,该方法返回学生的名字。下面可以进一步添加之前使用的三个属性:
回到终端,尝试用ruby student.rb
运行文件。应该不会看到有结果输出。
这是为什么呢? 上面步骤中已经定义了一个Student
类,并表示一个学生有一个名为introduction
的方法以及一些属性 - 但是实际上并没有创建Student
类的实例或调用任何方法。
当定义一个类后,还要创建类的一个实例,如下所示:
在Student
类上调用new
方法并将其存储到变量frank
中。当有了这个类的实例以后,就可以调用实例的方法来设置或获取其属性。
使用以下语法调用方法:object.method_name
。在上面示例中,创建一个实例变量:frank
,现在可以通过调用 frank.introduction
来获取学生的介绍信息了。
在student.rb
文件的底部,在Student类的end
关键字之后,添加以下内容:
最终完整的代码如下所示 -
有时,方法使用一个或多个参数来完成一些事情。 例如,可以调用 frank.introduction('Minlee')
,让它向Minlee
介绍自己。参数可以是数字,字符串或任何种类的对象,下面修改introduction
方法,以使用一个参数:
在Ruby中,每次调用方法时都会得到一个值。 默认情况下,Ruby方法返回其评估求值的最后一个表达式的值。
该方法的最后一行(只有)行是第7
行。这个表达式作为方法的返回值,该值返回给调用该方法的任何人。在例子中,这7
数字值返回并被插入到字符串中。
注意:写在最后,需要注意的是:这篇教程包教不包会!
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。