[TOC] 之前写博客太作逼了,说到底,博客还是给自己看的,所以,以后的博客可能不是那么的说人话
一. 杂项
-
Ruby中可以子符串中获取到变量的值,不同于C中的”%”控制符,也不同于VimScript中的${}
Ruby中使用的是#{var},在子符串中获取到变量的值
- 调用类时,需要写类名,当然也可以
include Math
之后就可以随便使用Math中的方法
-
“string”,会进行转义, ‘string’不会进行转义
-
Ruby中的数组是动态数组,会自动根据需求调整数组大小,所以要写具有Ruby风格的数组操作代码
比如
array = [] array[2] = 3 p array #=> [nil, nil, 3] p array.szie #=> 3
总之,在符合标准的条件下,自由进行代码组织,Ruby是非常灵活的,给”人”写的语言
-
散列的两种组织方法
由于散利的键一般是符号/字符串,我们倾向于使用符号,因为只是判断相等与否,符号的开销小
那么,就有两种散利的创建方法,一种是转换为符号(符号化),一种是直接操作符号
hash = {:foo => "1", :soo => "2"} hash_test = {foo: "1", soo: "2"}
-
正则表达式的用法
既然是脚本语言,那么正则的使用是必不可少的,Ruby使用正则时是这样的
/pattern/ =~ string
就是这样进行匹配的,其中的pattern为模式串,即常写的正则表达式
-
从命令行获取输入使用的是预定义数组(伪变量),切记,ARGV[x]中取出的是字符串,需要to_?方法
- 区分类与库,刚接触,还混淆过,require用来引用库,就像include之于C一般
二, 对象,变量,常量
来捋一捋概念:
Ruby中数据的基本单位是对象,对象有很多种
对象的特征,可以进行的操作,全部由类进行封装,
实例就是对象,实例的说法是对类而言的,类就像是一类东西,实例就是其中一个具象的表达,即为对象
所以,在Ruby中,实例即为对象
另外,还有容器这个名词,那么,什么是容器,array,hash就是容器,因为他们是存放对象的对象
1. 变量的类型
Ruby也不复杂,变量类型就四种:
局部变量(英语字母或_开头),全局变量($),实例变量(@),类变量(@@)
另外,注意伪变量,false, true, ARGV, nil,这些即使赋值了,值也不会改变的
同其他编程语言(C),变量未经初始化,不能进行使用,会抛出异常
2. 常量
常量要注意两点:
<1>.常量不能重复赋值,会抛异常
<2>.Ruby中的常量都是大写字母
3. 灵活的使用多重赋值
4. 变量的命名方法
简单地来说,就三点:
<1>.使用含义清晰,不冗杂的命名
<2>.变量和方法使用下划线命名法
<3>.类名和模块名使用驼峰命名法
三, 条件判断
条件判断,其中重要的是:Ruby中何为真假值
真假 | 类型 |
---|---|
真 | false/nil以外所有值 |
假 | fasle, nil |
从C转过来的,要十分注意这里
语句,看一下下面的例子就懂了
if condition then
do something
elsif condtion then
do something
else
do something
end
unless condtion then
do something
else
do something
end
case object then
when value1 then
do something
when value2 then
do something
else
do something
end
ruby的条件判断就上面三种语句,
从静态语言到脚本语言,是有点不适应,语法太过于灵活自由
方法调用,可以不给参数加括号,
上面三种于语句的条件(condtion)都不需要括号,同时then也都也可以省略
但是,虽然语法自由,要写出自己的风格
既然语法自由,所以,可以将if/unless作为修饰符
puts "a > b" if a > b
puts "a > b" unless a <= b
语句处理比较简单地时候,可以这样写,写得更加优雅,而不是在if ~ then ~ end 块中就只有一条语句
2. 聊聊对象的同一性
既然Ruby中数据的基本单位是对象,那么,如何区分看上去相同的对象呢?
str1 = "hello"
str2 = "hello"
str1 == str2 ? ? ?
上面使用”==”不太恰当,是为了说是否相等
答案是:值相等,但并非是同一对象
p str1.object_id #=> 10476400
p str2.object_id #=> 10437580
很显然,并不相同
所以我们,可以使用方法来进行判断,下面提到两个极易混淆的方法
str1.equal?(str2) #=> false 检查是否为同一对象
str1.eql?(str2) #=> true 检查是否相等
但是,eql?方法,进行检查是否相等时,内部实现,相对于 == 更为严谨
1.eql?(1.0) #=> false
p 1 == 1.0 #=> true
尤其是在散列值得获取时,要十分注意,散列的内部实现是eql?方法
同时,我们自己在构建方法,是,也要遵守返回值为真假时,以?结尾的方法名
3, nil是什么
之前说过,Ruby中真假值的判断与C有所不同,C中,NULL是什么?
NULL指空指针,实际上是啥?
就是这个,(void *)0
#define NULL (void *)0
所以,NULL可以所谓假的判断条件,
而nil指的是对象不存在,这样一想,所以nil也可以作为假的判断条件
四, 循环控制
循环的部分,有着这些注意的
for语句的用法
与C中稍有不同
for var in object do
loop something
end
这个对象还可以是,动态生成的(x..y)
来看看Ruby中循环控制符
控制符 | 作用 |
---|---|
break | 跳出循环 |
next | 结束此次循环,进入下次,类似于continue |
redo | 重复上一次的行为 |
关于redo:
这是一个比较神油的关键字,看下面这个例子
name = ["Ruby", "Python", "C++", "Java"]
i = 0
name.each do |lang|
i += 1
redo if i == 2
print [i,lang],"\n"
end
#=>
[1, "Ruby"]
[3, "Python"]
[4, "C++"]
[5, "Java"]
当 i == 2 时,执行redo
程序回到这个块首,重新执行
i += 1
因此,才能跳出循环,否则会变成死循环
一般情况下,ruby仅提供此关键词,即使是Ruby类库中,一般也不会用到此关键字
一般,break, next便可以处理大部分情况,即使要用redo,也要十分谨慎
来看看循环语句的区分,毕竟ruby提供了6方式来进行循环
不同方式 | 主要用途 |
---|---|
times 方法 | 确定循环次数时使用 |
for 语句 | 从对象中取出元素时使用(each的语法糖) |
while 语句 | 自由制定循环条件时 |
until 语句 | while比较难懂时,反其道行之 |
each 方法 | 从对象中取出元素时使用 |
loop 方法 | 不限制循环次数时使用 |
到这里,糖多的语言,写的是真的舒服
for的内部实现,就是使用each方法
五, do ~ end 与{ ~ }
这是两种块的写法,
我们通常有以下的约定:
<1>. 程序跨行时,使用do ~ end的写法
<2>. 程序在一行时,使用{ ~ }的写法
10.times do |i|
puts i
end
#=> 10.times {|i| puts i}
这些都是些基础内容,下一次就是些OOP的知识了
让我吹一句,人中之龙天下第一 (滑稽)
February 1, 2018 9:41 PM