前言
本文是对Ruby一些语法特点的记录。。。
数组循环
对于数组的循环,Ruby提供了each方法:
[1, 2, 3].each do |item|
p item.to_s
end
在do
与end
之间是block与swift的块概念相同,item
则是迭代时候每个元素引用名。
符号
在散列中,为了更有效率的区分字符串是否相等,引入了概念符号
。下面栗子为符号与字符串相转换。
sym = :foo
p sym.to_s
p :fo.to_sym
散列
创建
address = {:name => "王尼玛", :country => "中国", :postal => "345321"}
// 当做键来使用的时候可以简写为如下,注意:冒号尾随key不要留空格
address = {name: "王尼玛", country: "中国", postal: "345321"}
索引
p address[:name]
address[:name] = "暴走漫画"
循环
散列的each语法:
address.each do |k, v|
puts "#{k}: #{v}"
end
Ruby中的nil
nil是一个特殊的值,表示对象不存在(oc,swift类似概念)。
当一个散列获取对象不存在的时候返回nil,这里与oc不太一样,oc返回NSNull。
命令行对脚本传参
读文件
基本步骤:
- 打开文件
- 读取数据
- 输出文本
- 关闭文件
filename = ARGV[0]
file = File.open(filename)
text = file.read
p text
file.close
默认当前文件夹,so执行ruby abc.rb abc.rb
这里当文件巨大的时候,只进行一次IO有可能导致崩溃。这时候要逐行进行读取。
filename = ARGV[0]
file = File.open(filename)
file.each_line do |line|
p line
end
file.close
方法的定义
def hello
p "hello, ruby"
end
hello()
pp库
pp是pretty print缩写,代码清单
require 'pp'
v = [{
key00: "星际穿越星际穿越星际穿越星际穿越星际穿越星际穿越星际穿越",
key01: "盗梦空间盗梦空间盗梦空间盗梦空间盗梦空间盗梦空间盗梦空间",
key02: "记忆裂痕记忆裂痕记忆裂痕记忆裂痕记忆裂痕记忆裂痕记忆裂痕"
}]
p v
pp v
区别是会适当换行。。
Ruby中的对象
基本数据都是对象。
- 数值对象
- 数组、散列对象
- 字符串对象
- 正则表达式对象
- 时间对象
- 文件对象
- 符号对象 - 表示用识别方法等名称标签的对象
Ruby中的类
Ruby的类表示就是对象的种类。
- 数值 => Numeric
- 字符串 => String
- 数组 => Array
- 散列 => Hash
- 正则表达式 => Regexp
- 文件 => File
- 符号 => Symbol
Ruby中的变量
- 局部变量 - 英文字母或者_打头
- 全局变量 - 以$打头
- 实例变量 - 以@打头
- 类变量 - 以@@打头
- 伪变量 - nil/true/false/self
Ruby中的常量
常量以大写字母打头
TEST = 1
对常量进行二次赋值会产生警告哦。
多重赋值
这里提一个*符号自动赋值分配
a, b, *c = 1, 2, 3, 4, 5
p c
利用多重赋值的特性可以交换两个变量值
a, b = 5, 10
a, b = b, a
p [a, b]
case语句
classmates = ["王尼玛", "刘尼美", "王大锤"]
classmates.each do |mate|
case mate
when "王尼玛", "王大锤"
puts "男人"
else
puts "女人"
end
end
Ruby中的循环
循环的方法:
- times方法
- while语句
- each方法
- for语句
- until语句
- loop方法
直接上代码。。。难度0星
times
确定循环次数时候使用
// 引用上面一句话:基本数据都是对象
7.times do
p "Ruby"
end
// 等价变种 像不像Swift的尾闭包。。应该是Swift像Ruby
7.times {
p "Ruby"
}
// 可以知道当前循环的次数 但是是从0开始
7.time do |i|
p "#{i}次"
end
for语句
从对象中去除元素的时候使用,each的语法糖
sum = 0
for i in 1..5
sum = sum + 1
end
p sum
while语句
希望自由指定循环条件时候使用
略 没啥好说的
until语句
与while相反,当用while变得晦涩的时候用
略 条件假的时候执行
each语句
从对象中取出元素的时候用
略
loop语句
不限制循环次数的时候用
loop在不加控制语句的时候会死循环,需要加上break,next,redo来进行循环控制。上栗子:
i = 0
## break
["one", "two", "three", "four"].each do |num|
i += 1
if i == 3
break
end
p [i, num]
end
i = 0
## next
["one", "two", "three", "four"].each do |num|
i += 1
if i == 3
next
end
p [i, num]
end
i = 0
##redo
["one", "two", "three", "four"].each do |num|
i += 1
if i == 3
redo
end
p [i, num]
end
运行结果:
Ruby中的方法
方法的类型
- 实例方法
- 类方法
- 函数式方法
举个栗子:
// 实例方法
p "Hello World, Hello Ruby".split(",")
p [1, 2, 3, 4].index(2)
p 1000.to_s
// 类方法
Array.new
File.open("file_path")
Time.now
Array["a", "b"]
// 函数式方法 没有消息接收者
print "hello"
sleep(10)
方法的定义
这里讲下方法多参数带默认值
def func(a, b=1, c=3)
##do something
end
方法返回值
支持多返回值(元组)类Swift...Swift类Ruby 略
若return不写则返回nil。
定义带块的方法
关键字yield
略。。
参数个数不确定的方法
def foo(*args)
args
end
p foo(1, 2, 3)
至少需要指定一个参数的方法的定义
def meth(arg, *agrs)
[arg, args]
end
所有不确定个数的参数都作为数组赋值给变量args。当*变量名这种形式的参数出现得时候,只能在方法定义的参数列表出现一次。只确定首个跟最后一个参数名。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。