Ruby Tips

前言

本文是对Ruby一些语法特点的记录。。。

数组循环

对于数组的循环,Ruby提供了each方法:

[1, 2, 3].each do |item|
  p item.to_s
end

doend之间是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。

命令行对脚本传参

Ruby Tips_第1张图片

读文件

基本步骤:

  • 打开文件
  • 读取数据
  • 输出文本
  • 关闭文件
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 Tips_第2张图片

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。当*变量名这种形式的参数出现得时候,只能在方法定义的参数列表出现一次。只确定首个跟最后一个参数名。

你可能感兴趣的:(ruby,tips)