Ruby:基本语法
下面,我要开始学习Ruby基本语法了,最近忙的只有晚上能学一会了。
感觉身体被掏空变量
- 局部变量:英文字母或
_
开头(注意关键字) - 全局变量:
$
开头(不推荐) - 实例变量:
@
开头 - 类变量:
@@
开头 - 伪变量:
nil
,true
,false
,self
等 - 预定义变量
常量
以大写字母开头(可以修改,但有警告)
多重赋值
- 合并赋值
>> a,b,c=1,2,3
>> p [a,b,c]
[1, 2, 3] # 挨个赋值
>> a,b,c=1,2
>> p [a,b,c]
[1, 2, nil] # 缺少的用nil
>> a,b,c=1,2,3,4
>> p [a,b,c]
[1, 2, 3] # 多余的丢弃
>> a,b,*c=1,2,3,4
>> p [a,b,c]
[1, 2, [3, 4]] # 未分配的值封装为数组赋给*变量
>> a,*b,c=1,2,3,4
>> p [a,b,c]
[1, [2, 3], 4] # 同上
>>
置换变量:a,b = b,a(厉害了,word哥!)这个666,我之前都没见过这种用法啊
- 多重赋值还有更多的用法(提取数组中的数据),这里就不赘述了
输出语句
- puts:自动在每个字符串末尾加换行符
- p:原样输出不进行转义
- pp:以换行调整输出结果
通过程序来看一下:
➜ ~ irb --simple-prompt
>> print "123\n","123"
123
123
=> nil
>> puts "123","123"
123
123
=> nil
>> p "123\n","123"
"123\n"
"123"
=> ["123\n", "123"]
>>
可以看出上面的结论,同时也可以看出p
方法与另外两个方法不同(注意返回值)
# 我为什么要加横线呢,因为上边是我昨晚上写的
忍住控制语句
- 顺序控制
- 条件控制
if -
then- (elseif-then/else) - end(条件为真执行)
unless -then- (else) - end(条件为假执行)
case - (when -then)* - else - end(when可指定多个值,广义相等)
- 循环控制
for [var] in [start]..[end]
do- end(for [var] in [object]do- end)
while -do- end
until -do- end(条件为假时执行)
[number].times do|[var]|- end
[object].each do |[var]*| - end(([start]..[end]).each do|[var]|- end)
loop do - (break) - end
- 异常控制
begin - rescue
[Exception] => [ex var]-ensure- end(类比try-catch-finally)
使用raise
抛出异常
可以使用retry
指定重新回到begin
处重新执行(适当的sleep
)
若不定义[ex var],则:
$!
表示最后发生的异常对象
$@
表示最后发生异常的位置信息(=$!.backtrace
)
说明
- 广义相等
===
是指:相等、同=~
匹配、右边对象属于左边类 .etc.
when即是使用===
判断,但when可以指定多个值 - if/unless可以作为修饰:
puts "a>b" if a>b
- 循环控制:
break
/next
/redo
-
do - end
等同于{ - }
:约定多行用前者,写于一行用后者
10.times {|i| puts i}
- 若整个方法体都被
begin-end
包括,可以省略(只写rescue
和ensure
)
正则表达式
/pattern/ =~ "String"
返回匹配索引位置或nil
/pattern/i
表示不区分大小写
=> ["joshua", "lbq", "ben"]
>> names.each do |name|
?> if /b/ =~ name # nil与false表示假,其余均为真
>> puts name
>> end
>> end
lbq
ben
=> ["joshua", "lbq", "ben"]
>>
方法
- 实例方法(最常用),例如
to_s
对象能够使用的实例方法是由所属的类决定的 - 类方法,例如
Array.new
调用类方法,可以使用::
替代.
- 函数式方法:没有接受者,例如
print
方法定义
def [function] (args=default...) - return - end
def [function] (arg 1: default 1, arg 2: default 2, ..., **undefined) - end(推荐)
返回真假值的方法以?结尾
参数个数不确定,参数前加*
省略return则将最后一个表达式作为返回值(return表示返回nil)
带块方法:yield
补充:对于多个单词组合的变量名
使用 _ 隔开各个单词(变量名/方法名)
单词以大写字母开头(类名/模块名)
我看到的晚了,作业已经写完了[:cry]
库与引用库
require "lib"
# init ...
# call
先到这里,我去写个作业去(感觉已经可以做了,let me see 一 see)
类
类的创建(类名首字母大写)
class - def initialize(args) - end(new方法调用) - (def [function])* - end
@[var]:实例变量
self变量
存取器
attr_reader
attr_writer
attr_accessor
attr_accessor: name
等同于:
def name
@name
end
def name=(value)
@name = value
end
权限
public(函数默认为public,initialize除外)
private(initialize默认)
protected
模块
模块创建(首字母大写)
module - module_function: [function]* - end
语法太多,请自行查看
推荐使用《Ruby基础教程(中文第四版)》