目录
Ruby的基本概念
Ruby的控制语句
Ruby的循环
Ruby的数组与散列
Ruby的基本概念
运行Ruby的方式
- irb:可交互命令行,每输入一个式子,它都会用=>给出一个值
- ruby + 文件路径
变量
- 没有关键字: 没有var, let, const, 直接 a=1 就行
-
局部变量: 小写字母开头,或者_开头
-
全局变量: $开头
类变量: @@开头
实例变量: @开头
Ruby默认没有闭包
- 代码
a = 1
def f1
p a
end
fi() #括号可以省略
#报错:a不存在
- 默认没有闭包
闭包是指函数可以使用外部的自由变量
没有闭包是指函数不可以使用外部的自由变量
用Ruby其他语法可以实现闭包
常量
全大写:RUBY_VERSION/ARGV
- 代码
A = 1
def f1
p A
end
f1 #1
- 大写就是常量
多重赋值(JavaScript里叫做析构赋值)
- 简化
a,b,c = 1,2,3
a,b,*c = 1,2,3,4,5
a,*b,c = 1,2,3,4,5
- 交换
a,b = b,a
- 数组
arr = [1,2]
a,b = arr #a=1,b=2
字符串
- 单引号
puts '12\n34' #单引号不会转义
- 双引号
puts "12\n34" #双引号会把\n转义成换行
- 多行字符串
puts <
log
- 打印数据
print('a', 'b')-默认不加换行
puts('a', 'b')-默认每个加换行
p('a', 'b')-加换行,不转义,并且会直观的看出数据类型
只要没有歧义,括号()都可以省略
- 使用场景
程序员一般使用 p
日志里一般使用 puts 和 print
注释
- 单行注视
#这是单行注释
#这是第二行注释
- 多行注释
=begin
多行注释
=end
Ruby的控制语句
Ruby的if语句
if a > 3 then p 'big' end
if a > 3 then p 'big' else p 'small' end #ruby的if语句是有值的
p(if a > 3 then 'big' else p 'small' end)
p(if a > 4
'big'
elsif a > 2 #else if 在 ruby 里要写成 elsif
'middle'
else
'samll'
end)
Ruby的if语句2
b = if a > 3 then 'big' else 'samll' end
b = a > 3 ? 'big' : 'small'
return if error
return unless success # unless 和 if 是反逻辑
case语句(相当于JavaScript的switch case)
z = case x
when 1
'1'
when 2,3
'2 or 3'
else
'others'
end
Ruby的循环
.times方法
for 关键字
while 关键字
until 关键字
.each方法
loop 关键字
.times方法
- 一夜7次
7.times do
p 'one time'
end
或者
7.times {p 'one time'}
相当于JavaScript的
[0,1,2,3,4,5,6].map(i => {p 'one time'})
块
- .times是一个函数
- do...end是代码块
- {...}也是代码块
- 一般多行用do...end 单行用{...}
- 代码块作为.time函数的参数
- ruby的函数调用可以省略()
- 获取 i
7.times do |i|
p "#{i+1} 次" #这里必须使用双引号,否则不会转义,相当于JS的${i}
end
或者
7.times { |i|
p "#{i+1} 次"
}
两个代码都可以写成一行:
7.times do |i| p "#{i+1} 次" end
7.times { |i| p "#{i+1} 次"}
.each方法
- 代码
name = ['hanbaoyi', 'hby']
name.each do |name|
p name
end
name.each { |name| p name }
(1...7).each do |i| #1...7是一个Range,可以用(1...7).class打印出来
p i
end
(1...7).each { |i| p i }
for关键字
while/until关键字
loop关键字
- 代码(千万不能运行)
loop do
p 'ruby'
end
上面的代码会一直无限循环,除非在里面写break
跳出循环
break 表示退出所以循环
next 表示退出当前循环,进入下一次循环
对于JavaScript里的 break 和 continue
Ruby的数组与散列
Ruby中的数据类型
- 只有对象,可用.class查看类
整数-Integer对象/Numeric对象
浮点数-Float对象
字符串-String对象
数组-Array对象
正则表达式-Regexp对象
文件-File对象
符号-Symbol对象
异常-Exception对象
散列-Hash对象
- 标识
每个对象都有一个object_id属性,表示其唯一性
如: a.object_id a.equal? b
数组
由Array类构造出来的对象
[1,2].class
#Array
- Ruby数组
mixed = [1,2,'a','b','3']
mixed.size #相当于写mixed.size()
=>5
mixed.methods
打印出mixed的所有方法,注意这些方法都是以:冒号开头的,这是symbol
散列
由Hash类构造出来的对象
创建一个散列
person = {name: 'hby', age: 18}
#这是一个语法糖,ruby2.0之前的版本是不支持这种写法的symbol
上面的name和age不是字符串,而是symbol
等价于person = {:name=>'hby', :age=>18}
person.keys
=>[:name,:age]
如果想要字符串作为key,应该写成
person = {'name'=>'hby','age'=>18}
- 注意
你可以认为symbol是轻量级的字符串,功能更少
:name.to_s得到字符串,'name'.to_sym得到符号
遍历散列
- .each方法
person.each do |key,value|
p "key: #{key}, value: #{value}"
end
#输出时,symbol会自动变成string
与JavaScript的区别
person = {name: 'hby', age: 18},如果你想要获取'hby'
不能用person.name
必须用person[:name]
不能用person['name']
必须用person[:name]
'name'和:name是不同的
person['name'] = 'jack'
person.keys #[:name,:age,'name']
与JavaScript的区别2
def say_hi
p 'hi'
end
person = {name: 'hby', age: 18}
如果你想要给person加一个方法/函数
- 不能用person[:say_hi] = say_hi
因为say_hi等价于say_hi()
say_hi 的返回值为 p 'hi' 的返回值,也就是'hi'
所以相当于 person[:say_hi] = 'hi'
- 可以用lambda表达式做到
person[:say_hi] = lambda{p 'hi'}
person[:say_hi].call() #括号()可以省略
推荐的一些学习资源
- 菜鸟教程
过于简单,适合新手
- API手册(字典)
devdocs.io 建议学习的时候查
apidock.com/ruby 建议做项目的时候查,更全面
- 书籍
《Ruby基础教程》很基础,看起来很慢
《Ruby元编程》高级教程,等你熟悉Rails之后再考虑看