Qo_Tn
第一章 学习
1.1 Ruby
ruby 特性
弱类型 语言
1.3 下载安装Ruby 和 Rails
终端 命令 :
安装 rails
gem install rails
1.4 开发工具 RubyMine
知了破解版
1.5 手动编译Ruby程序
终端 命令:
编译:
ruby 路径+**
检查代码:ruby -c 文件名.rb
打开警告:ruby -w 文件名.rb
执行字面脚本:ruby -e 文件名.rb
在行模式下运行:ruby -l 文件名.rb
ruby -e 'print "Hello";print "Ruby"'
ruby -le 'print "Hello";print "Ruby"'
组合命令
-cw
-le
1.6 实现计算器
puts "Please input Numberl:"
number1=gets
puts "Please input a operator(+,-,*,/):"
op=gets
puts "Please input Number2:"
number2=gets
case op.chomp
when "+"
result=number1.to_i+number2.to_i
when "-"
result=number1.to_i-number2.to_i
when
result=number1.to_i*number2.to_i
when
result=number1.to_i/number2.to_i
end
puts "Result:#{number1.chomp}#{op.chomp}#{number2.chomp}=#{result}"
第二章学习
2.1 常量的使用
定义方法(字母大写)
'常量名(大写)"='值'
相同名 警告错误,报错
例子:
PLANT=200
CORPSE=10
puts "僵尸进攻一次,植物的生命是:"+(PLANT-CORPSE).to_s
$!
2.2 变量的使用
定义变量
局部变量必须以小写字母或者下划线开头
局部变量 有自己的作用域
例如:
class Test
_info="我是在类中被定义的局部变量"
puts _info
end
module ModelInfo
_info="我是被定义的模块中的局部变量"
puts _info
end
def info
_info="我是被定义的方法中的局部变量"
puts _tinfo
end
全局变量
- 作用于全局,任何地方都可以定义
- 可以在类中访问,也可以在方法中访问
- 全局变量以“$”开头
例如:
$info="我是被定义的全局变量,是最顶层的变量,我的Fans最多"
def infoQ
tinfo="我是被定义的局部变量"
puts tinfo
puts $info
end
module ModelInfoQ
_info="我是被定义的模块中的局部变量"
puts _info
puts $info
end
class TestQ
_info="我是在类中被定义的局部变量"
puts _info
puts $info
end
puts $info
全局变量 | 说明 |
---|---|
$! | 最近一次的错误信息 |
$@ | 错误产生的位置 |
$_ | gets最近读的字符串 |
$. | 解释器最近读的行数 |
$& | 最近一次与正则表达式佩佩的字符串 |
$~ | 作为字表达式组的最近一次匹配 |
$n | 最近匹配的第那个子表达式 |
$= | 是否区分大小写的标志 |
$/ | 输入记录分隔符 |
$\ | 输出记录分隔符 |
$0 | Ruby脚本文件名 |
$* | 命令行参数 |
$$ | 解释器进程ID |
$? | 最近一次执行的子进程退出状态 |
2.3 数据类型的使用
数据类型
三大数据类型 (数值型、范围、符号)
数值型:整数、浮点数
整数:Fixnum、Bignum
新版本 2的30次方不在区分 .class 统一打印 Integer
浮点型
带有小数点的字符串,例如:f=3.12
c范围 ('..' 或 '...')
a..b 或 a....b
a..b 定义的是从值a到值b的范围,包括值a,值b以及值a,值b中间的值
a...b 定义的是从值a到值b的范围,包括值a,以及值a,值b中间的值,但不包括值b
Ruby 中,范围是一个对象,是Range类的实例。迭代器
(regect、select、each)
regect:
将该范围转换成一个数组,并删除掉满足条件的元素。
select:
将该范围转换成一个数组,只选择满足条件的元素。
each:
输出迭代范围中的每个元素。
符号
符号也是一个对象.
符号对象是一个字符串,一个方法,一个类或者一个标识符的内部表示形式。
创建符号对象就在对象名前面加上一个冒号':'就可以了。
只要对象名相同,则产生的符号对象就相同。
字符串和符号对象之间是一一对应的。
字符串和符号对象就可以通过to_s和to_sym来进行相互转换。
例如:
dcy="我是你的忠实粉丝啊"
ly=:"我是你的忠实粉丝啊"
puts dcy.to_sym==ly
puts ly.to_s==dcy
返回:
true
true
符号对象还可以用
%s{表示法}
来创建例如
dcy="我是你的忠实粉丝啊"
ly=:dcy
dcyandly=%s{dcy}
puts ly==dcyandly
返回 true
2.4 算术运算符和赋值运算符
算数运算符
全局变量 | 说明 | 计算 | 结果 |
---|---|---|---|
+ | 加号 | Z=2+1 | Z的结果是:3 |
- | 减号 | Z=2-1 | Z的结果是:1 |
* | 乘号 | Z=2*3 | Z的结果是:6 |
/ | 除号 | Z=6/3 | Z的结果是:2 |
% | 求余 | Z=5%2 | Z的结果是:1 |
** | 乘方运算 | Z=5**2 | Z的结果是:25 |
赋值运算符
运算符 | 说明 | 计算 | 结果 |
----------|:----------:|----------|----------|
= | 赋值 | Z=1 | Z的结果是:1 |
+= | 加法赋值 | Z=1, Z+=1 | Z的结果是:2 |
-= | 减法赋值 | Z=3, Z-=1 | Z的结果是:2 |
*= | 乘法赋值 | Z=2, Z*=3 | Z的结果是:6 |
/= | 除法赋值 | Z=7, Z/=3 | Z的结果是:2 |
%= | 求余赋值 | Z=2, Z%=2 | Z的结果是:0 |
**= | 乘方赋值 | Z=2, Z**=2 | Z的结果是:4 |
2.5 位运算符的使用
位运算符
首先将十进制的数字转换成二进制,然后才能进行按位运算。
位运算符是对整数数组的位进行逻辑运算。
位运算符 | 说明 | 计算 | 结果 | |
---|---|---|---|---|
& | 按位"与" | Z=10&12 | Z的结果是:8 | |
^ | 按位"异或" | Z=10^12 | Z的结果是:6 | |
按位"或" | Z=10 | 12 | Z的结果是:14 | |
~ | 按位"非" | Z=~10 | Z的结果是:-11 | |
<< | 按位向左移位 | Z=12<<2 | Z的结果是:48 | |
>> | 按位向右移位 | Z=10>>2 | Z的结果是:2 |
除了“~”是单目运算符,即需要一个操作数,而其他的都是双运算符,即需要两个操作数。
2.6 比较运算符和逻辑运算符
比较运算符
比较运算符 | 说明 |
---|---|
> | 大于 |
< | 小于 |
<= | 小于或者等于 |
>= | 大于或者等于 |
== | 等于 |
!= | 不等于 |
<=> | 比较两个对象,分别返回1,0和-1 |
=== | 当普通对象处于运算符的左边时,该运算符与“==”功能相同; 但左边的对象是一个Range对象,且右边对象包还在该Range内时,返回true,否则返回false |
=~ | 正则表达式匹配 |
!~ | 正则表达式不匹配 |
逻辑运算符
逻辑运算符 | 说明 |
---|---|
and | 按位"与" |
or | 按位"异或" |
not | 按位"或" |
&& | 逻辑"且" |
| | 逻辑"或" |
! | 逻辑"非" |
2.7 三目运算符的使用
第一个操作数为条件,如果第一个操作数成立,则返回一个值,否则返回另一个值。
例子:condition?true_value:false_value
2.8 表达式的返回值
表达式是由数字、运算符、数字分组符号(括号)、自由变量和约束变量等排在一起来求数值的组合。
在Ruby语言中,常量、变量、各种字面值、相关计算、if或者while等控制语句、类和方法的定义都可以称为是表达式。
表达式的返回值无非就是有两种: 一种是有返回值的,另一种是无返回值的。
例:
score=569
res=if score>600
score.to_s+"考上复旦没问题"
else
score.to_s+"分,我很惭愧,我落榜了!"
end
puts res
例2:
score1=596
res=while score1<600
puts "我的分数差"+score.to_s+"不到六百"
score+=1
end
puts res+"的值"
2.9 并行赋值和嵌套赋值
-
并行赋值
交换两个变量值,无需第三个变量。
两边变量、值不等同,多余的会被设置为nil或忽略
左边以*为前缀, 表示所有对应该变量的值以及后面的值将会组成一个数组,并赋给这个变量。
-
右边以*为前缀, 则会将这个数组拆开,按元素的相应位置进行并行赋值。
例如:
c,d="我是变量c","我是变量d" puts "交换前的变量c"+c,"交换后的变量d"+d c,d=d,c puts "交换后的变量c"+c,"交换后的变量d"+d
tianqi=["春天","夏天","秋天","冬天"] #(创建的数组) daibiao=["cyr代表温暖的春天(77·F)","wdc代表炎热的夏天(99`F)","wz代表凉爽的秋天(59·F)","yyl代表冷酷冬天(41·F)"] a,b=tianqi puts "a代表的是"+a,"b代表的是"+b a,*b=daibiao puts "a代表的是"+a+"\n数组b代表的是",b a,b="风雨哈佛路",*tianqi puts a,b
-
嵌套赋值
把左边的一些变量用括号括起来,形成一个变量列表;与之对应的右边的值用中括号括起来形成一个子并行赋值的列表。
例如:
tianqi=["春天","夏天","秋天","冬天"] b,(c,d),e=tianqi puts "输出的b是"+b.to_s,"输出的c是"+c.to_s,"输出的d是"+d.to_s,"输出的e是"+e.to_s b,(c,*d),e="春天",["夏天","不冷不热天","秋天"],"冬天" puts "b="+b.to_s,"c="+c.to_s,d,"e="+e.to_s
2.10 条件语句
-
条件语句
if (条件) then 代码块1 elseif (条件n) 代码块n else 代码块n+1 end
- if 修饰语句
例如:
str=1 if (str==1) puts "1月代表的是春天: 花香鸟语飘满村。细听来,句句是乡音。" end month=2 mothinfo="春天" if (month<3) puts "2月份是:"+mothInfo
- unless
如果...不,除非,除...之外 的意思。
unless (条件) then 代码块1 else 代码块2 end
a=2 unless a**5==32 then puts "a的5次方不是32" else puts "a的5次方是32" end
- case语句
case 表达式 when 常量1,常量2...常量3 then 代码块1 when 常量4,常量5...常量n then 代码块2 else 代码块3 end
num=6 case num when 6 puts "今天是周末" else puts "今天不是周末" end month=6 case month when 1,2,3 puts "春意盎然" when 4,5,6 puts "烈日骄阳" when 7,8,9 puts "秋高气爽" when 10,11,12 puts "冬雪棉被" else puts "该月份已超出程序可以计算的范围" end
2.11 循环语句
-
while 循环语句
while (条件) do 代码块 end
row=1 while (row<=9) do row=row+1 puts "第"+(row-1).to_s+"次被打印的是:"+row.to_s end
-
until 循环语句
与while 语句作用相反
row=0 flh=["红儿","橙儿","黄儿","绿儿","青儿","蓝儿","紫儿"] until (row>=7) do flh.each do |h| row=row+1 puts "王母娘娘的第"+row.to_s+"个女儿的名字是:"+h.to_s end end
-
for...in 循环语句
for 自定义名称 in Array|Hash do 代码块1 end
for...in 语句主要是遍历数组和Hash对象的元素
shiren=["蒹葭苍苍","白露为霜","所谓伊人","在水一方","乘兴见之","脸胖且长","乘兴会之","腰如水缸"]#创建数组 for shiju in shiren do puts shiju end
-
迭代器
主要用于将数组、Hash对象和普通对象的变量进行迭代输出。
-
array.each do |定义的变量名| 代码块 end
例如:
names=["琵琶语","东风破","小酒窝","擦身而过"] names.each do |name| puts name end
-
loop
- loop 是一个最基本的迭代器,使用loop语句可以执行循环功能,但是必须注意的是: 使用loop语句进行循环时,程序会无限次的循环指定的代码,因此必须使用break语句来结束这个循环。
2.12 跳转语句
- break、next、redo、return
- break
跳出整个循环,嵌套中跳出嵌套(一层)
- next
结束循环语句,next只终止当前的循环,进行下一个循环
- redo
类似于next,不同的是,使用redo 语句,不用检查循环条件是否成立,就执行下一次循环。
- return
用来结束循环语句,但是return 主要用来结束一个方法,并且针对这个方法有返回值。
- break
例如:
```
i=0
loop{
puts "i的值是"+i.to_s
i+=1
if (i>=3)
break
end
}
puts "--------------------------------------------------------------"
music=1
while (music<=5) do
if (music==5)
music+=1
next
end
puts "《简爱》这首歌曲已循环播放了"+music.to_s+"次"
music+=1
yinyue=1
while (yinyue<=3) do
if (yinyue==2)
yinyue+=1
next
end
puts "《曲终人散》这首音乐已经循环播放了"+yinyue.to_s+"次"
yinyue+=1
end
end
puts "--------------------------------------------------------------"
i=1
while (i<=5) do
if (i==5)
i+=1
redo
end
puts "这是第"+i.to_s+"次循环"
i+=1
end
puts "--------------------------------------------------------------"
def search(weatherName)
weathers=["春天","夏天","秋天","冬天"]
for weather in weathers do
puts weather
if (weather==weatherName) then
return true
else
return false
end
end
end
if search("春天") then
puts "这个月的天气是春天"
else
puts "这个月的天气不是春天"
end
```