设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 琳lin爱妮爱
打印 上一主题 下一主题

[通用发布] 学过C系语言的Ruby快速入门

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2014-6-21
帖子
27
11
 楼主| 发表于 2014-7-5 11:54:28 | 只看该作者
本帖最后由 琳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
例如:
RUBY 代码复制
  1. "aab" <=> "acb" # -1  (第二个 a 的 ASCII 码小于 c)
  2. [5] <=> [4,9]   # 1    (第一个元素 5 > 4)


===
右边的对象是否在左边区间之内,返回 true, false
例如:
RUBY 代码复制
  1. p  (0..9)=== 3.14       #true  
  2. p  ('a'..'f')=== 'c'     # true

上述 .. 是Ruby中区间的表示方法,会在后面的循环结构中进行说明。
在判断左右的对象是否相等时,也可以使用。 

eql?
比较两个对象的值、类型是否相等,返回 true, false
例如:
RUBY 代码复制
  1. a=1
  2. b=1.0
  3. a.eql?(b)    #false (a是整型,而b是浮点型)


equal?
比较两个对象在内存中地址是否相同,返回 true, false
例如:
RUBY 代码复制
  1. a="aaa"
  2. b="aaa"
  3. a.equal?(b)    #false
  4. ######
  5. a="aaa"
  6. b=a
  7. a.equal?(b) # true


=~   【匹配】
用来比较是否符合一个正则表达式,返回模式在字符串中被匹配到的
位置,否则返回 nil

!~   【不匹配】
断言不符合一个正则表达式,返回 true, false

何为正则表达式,会在后面进行说明。
虽然以上几个在RM脚本中几乎没有出现,但它们还是属于Ruby语言中必不可少的一部分。

点评

ture和flase,极易拼错的两个关键字~  发表于 2014-7-5 15:39
没,刚刚一下手拙就改错了  发表于 2014-7-5 14:41
我说的是equal?不是eql?啊……eql?用1和1.0说明毫无问题  发表于 2014-7-5 14:31
在获取bool值的时候,永远不要使用and,or,not,而是使用&&、||、!,不然优先级坑死你。在流程控制时可以考虑使用and,or  发表于 2014-7-5 14:28
还有你false全拼成flase了  发表于 2014-7-5 14:24
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2014-6-21
帖子
27
12
 楼主| 发表于 2014-7-5 14:15:47 | 只看该作者
本帖最后由 琳lin爱妮爱 于 2014-7-6 10:44 编辑

四、选择判断语句
1.if...end
RUBY 代码复制
  1. a = 10
  2. if a < 15
  3.   print "a比15小。"
  4. end
  5. #输出 a比15小。

Ruby中不再像C系语言一样使用{},而是使用end来代表一段语句的结束。

在if条件后,执行的语句前,也可以加上then,构成:
if  条件 then 语句1; 语句2 ; 语句…  end 的结构
例如:
RUBY 代码复制
  1. a = 10
  2. if a < 15
  3. then print "a比15小。"
  4. end
  5. #输出 a比15小。


在RM脚本中一般省略了then关键字。

2.if...elsif...else...end
在条件不满足时也要进行处理的情况下就使用 else,条件不满足但指定另一个条件的情况下就使用 elsif。
用法与C系语言的if...else if...else 一样。
例如:
RUBY 代码复制
  1. a = 7  
  2. if a >= 10
  3.   print "a比10大。"  
  4. elsif a >= 5
  5.   print "a比10小但是比5大。"
  6. else
  7.   print "a比5小。"
  8. end
  9. #输出 a比10小但是比5大。


3.unless...end
unless英语是除非的意思,也就是与 if 相反,在条件不满足时才进行某些处理,相当于if not。
例如:
RUBY 代码复制
  1. a = 7  
  2. unless a >= 10
  3.   print "a比10小。"
  4. end
  5. #输出 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

例如:
RUBY 代码复制
  1. a = 0  
  2. case a
  3. when 0  
  4.   print "零"
  5. when 1  
  6.   print "壹"  
  7. when 2  
  8.   print "贰"
  9. else
  10.   print "其他"
  11. end
  12. #输出 零


5.使用if 、unless修饰符,构成如下结构:
语句 if 条件
语句 unless 条件

例如:
RUBY 代码复制
  1. a = 10
  2. print "a比15小。" if a < 15
  3. #输出 a比15小。

RUBY 代码复制
  1. a = 10
  2. print "a比15小。" unless a > 15
  3. #输出 a比15小。

这种写法也是Ruby的推荐写法之一。

另外,当前面的语句超过两句时,也可以加上括号()构成如下结构:
( 语句1; 语句2 ; 语句… ) if   条件
( 语句1; 语句2 ; 语句… ) unless   条件
但此写法并不被人们所提倡,()也非常影响美观,所以如果语句超过了两句,推荐还是使用if...end结构为好。

6.条件?语句1:语句2
用法与C系语言一样。
例如:
RUBY 代码复制
  1. a = 5
  2. print (a >= 10 ? "a比10大。" : "a比10小。")
  3. #输出 a比10小。


在RM脚本中,上述语句使用频率都非常高,所以请大家注意好Ruby与C系语言两者之间的差别啦~

点评

Ruby没有C里面那种和表达式有区别的语句,都是表达式(有值)比如a = if a > 3 then 3 else a end  发表于 2015-5-5 15:03
if修饰符的优先级那么低,打括号干什么。(  发表于 2014-7-6 10:34
( 语句1; 语句2 ; 语句… ) if 条件 ( 语句1; 语句2 ; 语句… ) unless 条件 这些东西,还有例子里的括号都改掉啊  发表于 2014-7-6 10:33
内容已补充~  发表于 2014-7-6 10:33
通常情况下,加括号也很影响美观  发表于 2014-7-6 10:29
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

13
发表于 2014-7-5 15:07:43 | 只看该作者
琳lin爱妮爱 发表于 2014-7-5 14:15
四、选择判断语句
1.if...end
a = 10

RUBY 代码复制
  1. a = 10
  2. if a < 15
  3.   print "a比15小。" # 空两格
  4. end
  5. #输出 a比15小。


RUBY 代码复制
  1. a = 7  
  2. if a >= 10
  3.   print "a比10大。"  
  4. elsif a >= 5
  5.   print "a比10小但是比5大。"
  6. else
  7.   print "a比5小。"
  8. end


RUBY 代码复制
  1. a = 0  
  2. case a
  3. when 0  
  4.   print "零"
  5. when 1  
  6.   print "壹"  
  7. when 2  
  8.   print "贰"
  9. else
  10.   print "其他"
  11. end
  12. #输出 零


等等之类的。C系语言的风格和Ruby的风格有很大不同。但是C系语言也是要缩进的啊

点评

中文叫缩进,英文叫indent / indentation。专有名词……  发表于 2014-7-6 10:06
好吧。。。原来这个叫缩进,我只知道叫格式的说~下次码程序的时候会注意的  发表于 2014-7-5 15:36
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2014-6-21
帖子
27
14
 楼主| 发表于 2014-7-6 15:16:09 | 只看该作者
本帖最后由 琳lin爱妮爱 于 2014-7-6 17:03 编辑

五、循环控制语句
首先来说说区间的表示方法:使用..与...
1..5 表示1,2,3,4,5
1...5 表示1,2,3,4   <---【不含最后一个数】
请注意两者的区别

1.while...end
例如:这里我们想输出1到5
RUBY 代码复制
  1. i = 1
  2. while i <= 5
  3.   print i
  4.   i = i + 1
  5. end
  6. #输出 12345


2.until...end
until是直到的意思,也就是直到条件满足了就不再执行以下语句的意思,相当于while not
这里同样输出1到5
RUBY 代码复制
  1. i = 1
  2. until i > 5
  3.   print i
  4.   i = i + 1
  5. end
  6. #输出12345


3.使用while 、until修饰符,构成如下结构:
语句 while 条件
语句 until 条件

另外,当前面的语句有两句以上时,使用()构成如下结构:
( 语句1; 语句2 ; 语句… )   while   条件
( 语句1; 语句2 ; 语句… )   until   条件
但是语句超过两句以上时,还是使用while...end与until...end为好。
以上规则可以类比于选择判断语句。

4.for...in...end
RUBY 代码复制
  1. sum = 0  
  2. for i in 1..5  
  3.   sum = sum + i  
  4. end  
  5. p sum  #sum等于1加到5的和

另外,in后面接的对象不只可以是区间,还可以是数组、集合等等。

5.loop do...end
没有结束条件,不断进行循环处理
RUBY 代码复制
  1. i = 0
  2. loop do  
  3.   i = i + 1
  4.   p i
  5. end #一直循环

此语句需要配合循环控制语句跳出循环。

6.break 、next 、redo
break
跳出当层循环,即中断循环
例如:
RUBY 代码复制
  1. sum = 0
  2. for i in 1..5
  3.   break if i == 3 #当i等于3时,中断循环
  4.   sum = sum + i  
  5. end
  6. p sum  #sum等于1+2

另外break能够中断本block的调用方法的执行,跳至调用“本block的调用方法”的方法中。【此处可先不管】  

next
忽略本次循环的剩余部分,开始下一次的循环
例如:
RUBY 代码复制
  1. sum = 0
  2. for i in 1..5
  3.   next if i == 3 #当i等于3时,跳出本次循环,继续执行i = 4 时的循环
  4.   sum = sum + i
  5. end
  6. p sum #sum等于1+2+4+5

另外next的能够中断本block的执行,跳至它的调用方法中。【此处可先不管】

redo
重新启动当前的循环,不检查判断条件,以当前的条件重复一次动作
例如:
RUBY 代码复制
  1. for i in 1..3
  2.   p i
  3.   i = i + 1
  4.   redo if i==2
  5. end
  6. #输出 1223


7.times 、upto 、downto 、each 、step
times
反复次数.times{ |变量|
    反复执行的动作
}
中间的变量也可以省去。
例如:
RUBY 代码复制
  1. 3.times {  #大括号一定不要换行
  2.   print  "Hi!" }        #Hi!Hi!Hi!

由于C系语言的格式,大家很容易看到 '{ ' 就会习惯性的换行处理,但是在这里是不可以这样写的,因为Ruby的换行就等同于断句。
切记不可以写成
RUBY 代码复制
  1. 3.times
  2. {
  3.   print  "Hi!" }        #程序报错


upto与downto
RUBY 代码复制
  1. 1.upto(9) {|i| print  i  if  i<7 }     #123456

RUBY 代码复制
  1. 9.downto(1){|i| print  i  if  i<7 }   #654321


each
RUBY 代码复制
  1. (1..9).each {|i| print  i  if  i<7}    #123456

each方法是基本的循环方式,其实for是用each实现的特殊语法

step
RUBY 代码复制
  1. 0.step(11,3) {|i| print  i  }         #0369【可以理解为,从0开始到11,输出以3为倍数的数】


另外{}与do...end两者可以通用
例如:
RUBY 代码复制
  1. 3.times do  
  2.   print  "Hi!"
  3. end        #Hi!Hi!Hi!

点评

↑把大括号写在下一行的都是异端!;↓for那是Ruby照顾语言习惯,与好坏没有关系,等到搞明白了用户自然就会使用each,搞不明白强迫也没有用  发表于 2014-8-5 17:35
for里面变量的作用域太大,效率没有each高,还没有each好玩……each不加块返回一个enumerator,有很多好玩的东西  发表于 2014-7-6 18:49
↓for是给那些学C++的人用的,免得他们不高兴吧。  发表于 2014-7-6 18:44
早就打入冷宫了  发表于 2014-7-6 18:42
↓所以说for是被打入冷宫了么……  发表于 2014-7-6 18:39
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

15
发表于 2014-7-6 16:29:07 | 只看该作者
毫不夸张的说,学过C系语言尤其是OOP语言的人,要入门ruby就是一天的事情。我相信你自己有所体会。

但是,要继续学下去的话,C系语言的思维定势反而容易阻碍对Ruby的深入学习。ruby的一切都是灵活的、自然的、优美的、动态的、低效的,ruby对象的结构也让人耳目一新。

点评

"122344566788".each_char.each_slice.with_index.inject do 我在做什么啊  发表于 2014-8-5 17:40
入门被你用each拍死还不如不入【【【  发表于 2014-8-5 17:36
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
705 小时
注册时间
2007-12-23
帖子
874
16
发表于 2014-7-27 18:48:20 | 只看该作者
琳lin爱妮爱 发表于 2014-7-5 11:54
三、逻辑运算符与条件运算符

1.逻辑运算符(与或非)

对于整数,C系语言的 0 是false,其它数是true。那么ruby呢?全部都是true还是和C语言一样?

点评

全部为真  发表于 2014-7-27 19:08
买了正版RMMV的同学进来看一下,谢谢~
https://rpg.blue/thread-393237-1-1.html
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2014-4-2
帖子
13
17
发表于 2014-8-4 11:32:22 | 只看该作者
露珠加油,期待更新
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
163
在线时间
73 小时
注册时间
2014-4-10
帖子
109
18
发表于 2015-5-5 14:55:16 | 只看该作者
加油,期待更新!
我经常用C写一些单片机的驱动程序,可以说有点C的基础吧。目前刚刚想学RUBY。个人觉得学习RUBY最大的障碍是不懂超类和子类什么的,经常拿起一个脚本就不知道该去哪儿找各种变量还有方法的定义。“C系语言的思维定势反而容易阻碍对Ruby的深入学习。”我觉得挺对的,C很讲究基础化,RUBY又太模块化尤其是各种方法的混用。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
36 小时
注册时间
2013-8-27
帖子
5
19
发表于 2015-5-16 19:23:00 | 只看该作者
感谢楼主啊
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
3 小时
注册时间
2018-7-17
帖子
10
20
发表于 2018-7-17 17:03:30 | 只看该作者
身为一个学C++
不知为何,我的Python用得比C++还熟练
而且我的C#水平仅仅比C++水平差了点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 02:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表