Project1
标题: 学过C系语言的Ruby快速入门 [打印本页]
作者: 琳lin爱妮爱 时间: 2014-6-26 10:14
标题: 学过C系语言的Ruby快速入门
本帖最后由 琳lin爱妮爱 于 2014-7-6 18:11 编辑
在发帖之前一直有着比较忐忑的心情,因为图书馆里就有关于Ruby语言的入门基础,是零基础的入门。
由于本人是学过C与Java的孩纸,所以看零基础教程的时候就有一点无奈,有些东西是相同的,但有些东西有着不太相同的地方,还有一些东西完全不同。于是我看教程的时候也一直不敢快速的跳过。
于是,我是这么想的:如果是学过C系语言的孩纸,那么通过一些有针对性的简单的异同的讲解,一定可以用更短的时间学会Ruby这门语言。
我也不知道是不是已经有人写过相同的东西了,所以等待审批~如果版主认同我可以这么做的话,我就开始编写教程~~
【本人的心愿】
由于本人自己也不是特别的精通Ruby,也许在大神们看来还是处于入门级的阶段里
所以这段时间的编写已经出了相当多的问题,我也知道已经令很多大神无语了
正如题目所说,我是从C系语言走过来的孩纸,而且我的Ruby是自学的,所以我无法知道有些东西是不是理解正确或是有所遗漏
事实也证明如此,我每写完一个篇章,总是会有大神发现问题并且提了出来,同时我也长了很多的Ruby知识,对此我表示非常感谢
我希望通过这样的方法,与一起从C系语言走过来的各位孩纸,从初学到慢慢的理解Ruby,再到所谓的精通
我也相信,通过慢慢的编辑修改,以后也一定可以成为一篇好的教程,同时也希望各位大神能够继续帮助我
那么,请大家跟我一起攀登这长长的坡道吧~
【从4F开始进行连载~】
欢迎大家提出错误与意见
一、数字的计算
二、变量与变量的赋值
三、逻辑运算符与条件运算符
四、选择判断语句 <--【已更新】
五、循环控制语句 <--【已更新】
作者: taroxd 时间: 2014-6-26 11:23
届时请参加本区活动。活动预告见水区,蓝色高亮的帖子
作者: 琳lin爱妮爱 时间: 2014-6-26 12:09
taroxd 发表于 2014-6-26 11:23
届时请参加本区活动。活动预告见水区,蓝色高亮的帖子
因为我是第一次编写教程之类的,可能还弄的不好,所以我想先在这个帖子里写一写。如果版主觉得可以搬上正式舞台了,到时候我一定会参加活动的。
【ps:由于最近几天要考试,所以更贴的速度会很慢。考试完我会努力加速的~~】
作者: 琳lin爱妮爱 时间: 2014-6-26 13:55
这里开始正文吧~
题目已经顾名思义,本教程是针对学过C系语言的人所编写的。其实也不能叫编写,就是给大家一些学习Ruby的捷径。
由于C系语言与Ruby语言有一定的相通之处,所以学过C系语言的人在2-3个小时之内入门Ruby是完全有可能的。
这里所说的C系语言,包括C,C++,Java。C是面向过程,Java是面向对象的,而C++是插于两者之间的,既有面向过程,又有面向对象。所以这里本人将不着重说C++。
如果你是学过Java的,那么你只需要半天就能快速入门Ruby。
如果你是学过C语言,而没有学过Java的,那么你可能需要长一点的时间。主要在于需要弄懂面向对象是如何设计的【也就是俗称的类、对象与方法的定义与操作】。
当然,如果你有熟练的C语言与Java的编程能力,那么一定还能更快的学会。
本人观点认为,如果你想在2-3个小时内学会Ruby,那么需要你有以下的几个能力要求:
1.能熟练掌握如何进行程序的赋值、判断、循环操作;
2.能熟练进行函数的定义与调用;
3.能熟练的进行类的定义、类的操作、实例化对象与调用类内方法的操作【Java】;
4.做过小型程序,并能在平台上成功运行。
其实说到底,就是需要比较熟练的语言编写能力。
废话不多说了,准备开始~
作者: 琳lin爱妮爱 时间: 2014-6-26 14:04
【这一楼是暂时作为目录的,以后再进行编辑~~】
作者: fux2 时间: 2014-6-26 14:46
已转入发布版块。
作者: 琳lin爱妮爱 时间: 2014-6-27 13:34
本帖最后由 琳lin爱妮爱 于 2014-6-28 16:27 编辑
在正文开始之前,先普及几个语法点:
首先Ruby同C系语言一样,大小写敏感。请一定要注意大小写。
1.Ruby的注释语句:
分为单行与多行两种
单行注释为:#
例如:
输出为7.
这个使用的非常之多,而且与C与Java的注释语句不同,请记好。
多行的注释为:=begin 到=end
例如:
p 3 + 4
=begin
这么简单的东西你可能不会算吗?
p 7
=end
p 3 + 4
=begin
这么简单的东西你可能不会算吗?
p 7
=end
输出7.
但在RM脚本编译器中是很少使用的。【至少我是暂时没发现脚本中使用了这个】
想要注释多行时,一般情况下是这样使用的:
#==============================================================================
# ■ Vocab
#------------------------------------------------------------------------------
# 定义了用语和信息。将部分资料定义为常量。用语部分来自于 $data_system 。
#==============================================================================
#==============================================================================
# ■ Vocab
#------------------------------------------------------------------------------
# 定义了用语和信息。将部分资料定义为常量。用语部分来自于 $data_system 。
#==============================================================================
大家随手打开一个都是能够看到的。
2.Ruby的语句的输出语句:
p , print , puts
#使用p 语句输出
p 3 + 4
p "谁告诉我3+4等于8的?"
#使用print语句输出
print 3 + 4
print "谁告诉我3+4等于8的?"
#使用puts语句输出
puts 3 + 4
puts "谁告诉我3+4等于8的?"
#使用p 语句输出
p 3 + 4
p "谁告诉我3+4等于8的?"
#使用print语句输出
print 3 + 4
print "谁告诉我3+4等于8的?"
#使用puts语句输出
puts 3 + 4
puts "谁告诉我3+4等于8的?"
以上三个语句大致上可以通用,但是puts会在语句的后面自动添加一个换行符,直接换行。而print则不会。需要换行时使用 '\n' , 这里同C系语言一样。
另外,p 语句则更适合进行检查,因为p输出采用的是数组字面量的表示法,而prints与puts只是简单的将每个元素打印出来。这里可以暂时不必仔细研究。
输出语句在RM脚本编译器中很少出现。就如同Java的System.out.print语句一样,在后台命令中使用的非常多,而在图形界面设计的时候却从不会使用。但是在发现出错时,却可以巧妙的利用输出语句来输出当前的数据或文本,对解决BUG还是很有用处的。
3.Ruby语句的断句:
在Ruby语言中,同C系语言一样,用 ; 表示一句话的结束,也可以选择直接换行来表示一句话的结束。
在RM脚本编译器中使用的是直接换行。
如果语句太长,可以用“ \ ”连接下一行。
例如:
print "真的可以"\
"连行啊"
# 真的可以连行啊
print "真的可以"\
"连行啊"
# 真的可以连行啊
同样在RM脚本编译器中很少使用。
作者: 琳lin爱妮爱 时间: 2014-6-27 14:12
本帖最后由 琳lin爱妮爱 于 2014-6-27 14:17 编辑
一、数字的计算
1.基本的加减乘除运算与优先顺序同C系语言
#四则运算
p 1 + 1 # 加法
p 5 - 3 # 减法
p 2 * 5 # 乘法
p 3 / 9 # 除法
#优先顺序
p 2 * 2 + 1 * 3 # p 7
p 2 * (2 + 3) * 4 # p 40
p 2 * (2 + 3 * 4) # p 28
#四则运算
p 1 + 1 # 加法
p 5 - 3 # 减法
p 2 * 5 # 乘法
p 3 / 9 # 除法
#优先顺序
p 2 * 2 + 1 * 3 # p 7
p 2 * (2 + 3) * 4 # p 40
p 2 * (2 + 3 * 4) # p 28
2.浮点数的运算,除数或被除数至少要有一个是浮点数,计算的答案就会是浮点数。
p 5 / 2 # p 2
p 5.0 / 2 # p 2.5
p 5 / 2.0 # p 2.5
p 5 / 2 # p 2
p 5.0 / 2 # p 2.5
p 5 / 2.0 # p 2.5
3.求余数的计算同C系语言,使用 %
4.幂的计算,使用 **
例如求2的3次方
这个与C系语言不同,请注意。
作者: 琳lin爱妮爱 时间: 2014-6-28 15:46
本帖最后由 琳lin爱妮爱 于 2014-6-28 15:50 编辑
二、变量与变量的赋值
1.变量命名的规则
规则同C系语言一样,命名只能用英文字母、数字或_(下划线)开头,并且第一个字符必须是小写英文字母或 _(下划线)。
另外,不能使用关键字作变量的名称。学过C系语言的都应该知道关键字是什么意思,这里就不多说了。
Ruby的关键字有:
模块定义:module
类定义: class
方法定义:def , undef
检查类型:defined?
条件语句:if , then , else , elsif ,case ,when ,unless
循环语句:for ,in ,while ,until ,next, break ,do , redo ,retry ,yield
逻辑判断:not ,and ,or
逻辑值和空值:true ,false , nil
异常处理:rescue ,ensure
对象引用:super ,self
块的起始:begin/end
嵌入模块:BEGIN ,END
文件相关:__FILE__ , __LINE__
方法返回:return
别名: alias
大家现在不必着重去记忆,以后多多使用自然而然就会记住的。
2.变量的赋值
首先说变量为数字时的情况。
请先看一下用C语言赋值变量:
#include<stdio.h>
void main()
{
int x=4,y=3;
printf("%d",x+y);
}
#include<stdio.h>
void main()
{
int x=4,y=3;
printf("%d",x+y);
}
下面是Ruby语言赋值变量:
注意到有什么区别了吗?Ruby无需像C系语言那样定义int , float , double等数据类型就可以直接赋值。
大家也可以看看上面的Ruby关键字,就能注意到Ruby并没有关于数据类型的关键字。
其次是变量为字符串时的情况。
由于Ruby输出的语句有很多,但是我比较习惯用print输出语句,所以就用这个作为输出字符串的语句来讲解了。
同上面一样,Ruby无需使用char , string定义,字符串加上"",即可直接赋值给变量。
a = "我才不会告诉你我最喜欢什么东西呢。" #谁想知道这么无聊的事情
print a #输出赋值给a的字符串
a = "我才不会告诉你我最喜欢什么东西呢。" #谁想知道这么无聊的事情
print a #输出赋值给a的字符串
另外,Ruby语言还支持字符串变量的加法与乘法,这个会在后面详细说明。
3.全局变量 $
在变量名前加 $ 号,赋值方法和局部变量完全相同。
关于全局变量的定义,与C系语言一模一样,就是能在程序的任何地方都可以使用。
这个在RM脚本编译器里非常的常见,且是C系语言里所没有的,请注意一下。
作者: mkrptr 时间: 2014-6-28 16:35
计算机系的路过
好评如潮
作者: 琳lin爱妮爱 时间: 2014-7-5 11:54
本帖最后由 琳lin爱妮爱 于 2014-7-5 15:41 编辑
三、逻辑运算符与条件运算符
1.逻辑运算符(与或非)
逻辑与:&& 、and
逻辑或:|| 、 or
逻辑非:! 、not
主要是要注意每个后面的一项,读过英语的都是能够记住的。
不过推荐还是使用前者,因为有优先级的问题,而且在RM的脚本中也一般是使用的前者。
2.真假值
true 、false 、nil
nil可以相当于C系语言中的null ,也就是置空的意思,不过与null还是有一定区别的,null是一个空指针而nil是一个特殊的对象,这里可以暂时不必深究。
三者的使用方法与C系语言差不多,但需要注意的是:在Ruby中,nil 和 false 为假,其它都为真
3.条件运算符
Ruby的条件运算符比C系语言复杂
与C系语言相同的的条件运算符有:
< 小于
<= 小于等于
> 大于
>= 大于等于
== 等于
!= 不等于
需要注意的有以下几个:
<=>
比较两个对象的大小,大于、等于、小于 分别返回1,0,-1
例如:
"aab" <=> "acb" # -1 (第二个 a 的 ASCII 码小于 c)
[5] <=> [4,9] # 1 (第一个元素 5 > 4)
"aab" <=> "acb" # -1 (第二个 a 的 ASCII 码小于 c)
[5] <=> [4,9] # 1 (第一个元素 5 > 4)
===
右边的对象是否在左边区间之内,返回 true, false
例如:
p (0..9)=== 3.14 #true
p ('a'..'f')=== 'c' # true
p (0..9)=== 3.14 #true
p ('a'..'f')=== 'c' # true
上述 .. 是Ruby中区间的表示方法,会在后面的循环结构中进行说明。
在判断左右的对象是否相等时,也可以使用。
eql?
比较两个对象的值、类型是否相等,返回 true, false
例如:
a=1
b=1.0
a.eql?(b) #false (a是整型,而b是浮点型)
a=1
b=1.0
a.eql?(b) #false (a是整型,而b是浮点型)
equal?
比较两个对象在内存中地址是否相同,返回 true, false
例如:
a="aaa"
b="aaa"
a.equal?(b) #false
######
a="aaa"
b=a
a.equal?(b) # true
a="aaa"
b="aaa"
a.equal?(b) #false
######
a="aaa"
b=a
a.equal?(b) # true
=~ 【匹配】
用来比较是否符合一个正则表达式,返回模式在字符串中被匹配到的
位置,否则返回 nil
!~ 【不匹配】
断言不符合一个正则表达式,返回 true, false
何为正则表达式,会在后面进行说明。
虽然以上几个在RM脚本中几乎没有出现,但它们还是属于Ruby语言中必不可少的一部分。
作者: 琳lin爱妮爱 时间: 2014-7-5 14:15
本帖最后由 琳lin爱妮爱 于 2014-7-6 10:44 编辑
四、选择判断语句
1.if...end
a = 10
if a < 15
print "a比15小。"
end
#输出 a比15小。
a = 10
if a < 15
print "a比15小。"
end
#输出 a比15小。
Ruby中不再像C系语言一样使用{},而是使用end来代表一段语句的结束。
在if条件后,执行的语句前,也可以加上then,构成:
if 条件 then 语句1; 语句2 ; 语句… end 的结构
例如:
a = 10
if a < 15
then print "a比15小。"
end
#输出 a比15小。
a = 10
if a < 15
then print "a比15小。"
end
#输出 a比15小。
在RM脚本中一般省略了then关键字。
2.if...elsif...else...end
在条件不满足时也要进行处理的情况下就使用 else,条件不满足但指定另一个条件的情况下就使用 elsif。
用法与C系语言的if...else if...else 一样。
例如:
a = 7
if a >= 10
print "a比10大。"
elsif a >= 5
print "a比10小但是比5大。"
else
print "a比5小。"
end
#输出 a比10小但是比5大。
a = 7
if a >= 10
print "a比10大。"
elsif a >= 5
print "a比10小但是比5大。"
else
print "a比5小。"
end
#输出 a比10小但是比5大。
3.unless...end
unless英语是除非的意思,也就是与 if 相反,在条件不满足时才进行某些处理,相当于if not。
例如:
a = 7
unless a >= 10
print "a比10小。"
end
#输出 a比10小。
a = 7
unless a >= 10
print "a比10小。"
end
#输出 a比10小。
4.case...when...else...end
与C系语言中的switch...case...default语句大致一样。
具体结构如下:
case 对象
when 可能性1
语句1; 语句2 ; 语句…
when 可能性2
语句1; 语句2 ; 语句…
when 可能性…
语句1; 语句2 ; 语句…
else
语句1; 语句2 ; 语句…
end
例如:
a = 0
case a
when 0
print "零"
when 1
print "壹"
when 2
print "贰"
else
print "其他"
end
#输出 零
a = 0
case a
when 0
print "零"
when 1
print "壹"
when 2
print "贰"
else
print "其他"
end
#输出 零
5.使用if 、unless修饰符,构成如下结构:
语句 if 条件
语句 unless 条件
例如:
a = 10
print "a比15小。" if a < 15
#输出 a比15小。
a = 10
print "a比15小。" if a < 15
#输出 a比15小。
a = 10
print "a比15小。" unless a > 15
#输出 a比15小。
a = 10
print "a比15小。" unless a > 15
#输出 a比15小。
这种写法也是Ruby的推荐写法之一。
另外,当前面的语句超过两句时,也可以加上括号()构成如下结构:
( 语句1; 语句2 ; 语句… ) if 条件
( 语句1; 语句2 ; 语句… ) unless 条件
但此写法并不被人们所提倡,()也非常影响美观,所以如果语句超过了两句,推荐还是使用if...end结构为好。
6.条件?语句1:语句2
用法与C系语言一样。
例如:
a = 5
print (a >= 10 ? "a比10大。" : "a比10小。")
#输出 a比10小。
a = 5
print (a >= 10 ? "a比10大。" : "a比10小。")
#输出 a比10小。
在RM脚本中,上述语句使用频率都非常高,所以请大家注意好Ruby与C系语言两者之间的差别啦~
作者: taroxd 时间: 2014-7-5 15:07
琳lin爱妮爱 发表于 2014-7-5 14:15
四、选择判断语句
1.if...end
a = 10
a = 10
if a < 15
print "a比15小。" # 空两格
end
#输出 a比15小。
a = 10
if a < 15
print "a比15小。" # 空两格
end
#输出 a比15小。
a = 7
if a >= 10
print "a比10大。"
elsif a >= 5
print "a比10小但是比5大。"
else
print "a比5小。"
end
a = 7
if a >= 10
print "a比10大。"
elsif a >= 5
print "a比10小但是比5大。"
else
print "a比5小。"
end
a = 0
case a
when 0
print "零"
when 1
print "壹"
when 2
print "贰"
else
print "其他"
end
#输出 零
a = 0
case a
when 0
print "零"
when 1
print "壹"
when 2
print "贰"
else
print "其他"
end
#输出 零
等等之类的。C系语言的风格和Ruby的风格有很大不同。但是C系语言也是要缩进的啊
作者: 琳lin爱妮爱 时间: 2014-7-6 15:16
本帖最后由 琳lin爱妮爱 于 2014-7-6 17:03 编辑
五、循环控制语句
首先来说说区间的表示方法:使用..与...
1..5 表示1,2,3,4,5
1...5 表示1,2,3,4 <---【不含最后一个数】
请注意两者的区别
1.while...end
例如:这里我们想输出1到5
i = 1
while i <= 5
print i
i = i + 1
end
#输出 12345
i = 1
while i <= 5
print i
i = i + 1
end
#输出 12345
2.until...end
until是直到的意思,也就是直到条件满足了就不再执行以下语句的意思,相当于while not
这里同样输出1到5
i = 1
until i > 5
print i
i = i + 1
end
#输出12345
i = 1
until i > 5
print i
i = i + 1
end
#输出12345
3.使用while 、until修饰符,构成如下结构:
语句 while 条件
语句 until 条件
另外,当前面的语句有两句以上时,使用()构成如下结构:
( 语句1; 语句2 ; 语句… ) while 条件
( 语句1; 语句2 ; 语句… ) until 条件
但是语句超过两句以上时,还是使用while...end与until...end为好。
以上规则可以类比于选择判断语句。
4.for...in...end
sum = 0
for i in 1..5
sum = sum + i
end
p sum #sum等于1加到5的和
sum = 0
for i in 1..5
sum = sum + i
end
p sum #sum等于1加到5的和
另外,in后面接的对象不只可以是区间,还可以是数组、集合等等。
5.loop do...end
没有结束条件,不断进行循环处理
i = 0
loop do
i = i + 1
p i
end #一直循环
i = 0
loop do
i = i + 1
p i
end #一直循环
此语句需要配合循环控制语句跳出循环。
6.break 、next 、redo
break
跳出当层循环,即中断循环
例如:
sum = 0
for i in 1..5
break if i == 3 #当i等于3时,中断循环
sum = sum + i
end
p sum #sum等于1+2
sum = 0
for i in 1..5
break if i == 3 #当i等于3时,中断循环
sum = sum + i
end
p sum #sum等于1+2
另外break能够中断本block的调用方法的执行,跳至调用“本block的调用方法”的方法中。【此处可先不管】
next
忽略本次循环的剩余部分,开始下一次的循环
例如:
sum = 0
for i in 1..5
next if i == 3 #当i等于3时,跳出本次循环,继续执行i = 4 时的循环
sum = sum + i
end
p sum #sum等于1+2+4+5
sum = 0
for i in 1..5
next if i == 3 #当i等于3时,跳出本次循环,继续执行i = 4 时的循环
sum = sum + i
end
p sum #sum等于1+2+4+5
另外next的能够中断本block的执行,跳至它的调用方法中。【此处可先不管】
redo
重新启动当前的循环,不检查判断条件,以当前的条件重复一次动作
例如:
for i in 1..3
p i
i = i + 1
redo if i==2
end
#输出 1223
for i in 1..3
p i
i = i + 1
redo if i==2
end
#输出 1223
7.times 、upto 、downto 、each 、step
times
反复次数.times{ |变量|
反复执行的动作
}
中间的变量也可以省去。
例如:
3.times { #大括号一定不要换行
print "Hi!" } #Hi!Hi!Hi!
3.times { #大括号一定不要换行
print "Hi!" } #Hi!Hi!Hi!
由于C系语言的格式,大家很容易看到 '{ ' 就会习惯性的换行处理,但是在这里是不可以这样写的,因为Ruby的换行就等同于断句。
切记不可以写成
3.times
{
print "Hi!" } #程序报错
3.times
{
print "Hi!" } #程序报错
upto与downto
1.upto(9) {|i| print i if i<7 } #123456
1.upto(9) {|i| print i if i<7 } #123456
9.downto(1){|i| print i if i<7 } #654321
9.downto(1){|i| print i if i<7 } #654321
each
(1..9).each {|i| print i if i<7} #123456
(1..9).each {|i| print i if i<7} #123456
each方法是基本的循环方式,其实for是用each实现的特殊语法
step
0.step(11,3) {|i| print i } #0369【可以理解为,从0开始到11,输出以3为倍数的数】
0.step(11,3) {|i| print i } #0369【可以理解为,从0开始到11,输出以3为倍数的数】
另外{}与do...end两者可以通用
例如:
3.times do
print "Hi!"
end #Hi!Hi!Hi!
3.times do
print "Hi!"
end #Hi!Hi!Hi!
作者: taroxd 时间: 2014-7-6 16:29
毫不夸张的说,学过C系语言尤其是OOP语言的人,要入门ruby就是一天的事情。我相信你自己有所体会。
但是,要继续学下去的话,C系语言的思维定势反而容易阻碍对Ruby的深入学习。ruby的一切都是灵活的、自然的、优美的、动态的、低效的,ruby对象的结构也让人耳目一新。
作者: gonglinyuan 时间: 2014-7-27 18:48
琳lin爱妮爱 发表于 2014-7-5 11:54
三、逻辑运算符与条件运算符
1.逻辑运算符(与或非)
对于整数,C系语言的 0 是false,其它数是true。那么ruby呢?全部都是true还是和C语言一样?
作者: 失格病房 时间: 2014-8-4 11:32
露珠加油,期待更新
作者: k47363312 时间: 2015-5-5 14:55
加油,期待更新!
我经常用C写一些单片机的驱动程序,可以说有点C的基础吧。目前刚刚想学RUBY。个人觉得学习RUBY最大的障碍是不懂超类和子类什么的,经常拿起一个脚本就不知道该去哪儿找各种变量还有方法的定义。“C系语言的思维定势反而容易阻碍对Ruby的深入学习。”我觉得挺对的,C很讲究基础化,RUBY又太模块化尤其是各种方法的混用。
作者: didarua01 时间: 2015-5-16 19:23
感谢楼主啊
作者: 探求者 时间: 2018-7-17 17:03
身为一个学C++
不知为何,我的Python用得比C++还熟练
而且我的C#水平仅仅比C++水平差了点
作者: B612 时间: 2019-8-28 15:08
没有数据类型这一点和B语言很相似呀,但是它也是面向对象的
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |