Ruby是另一种脚本语言,为什么说“又”,因为我已经了解了lua和python,那么为什么要学习Ruby,最主要的原因是现在很多第三方工具,如Cocoapods、Jekyll是用Ruby写的,为了更好的了解他们,至少得看得懂Ruby语法,于是就有了该Blog,我会将我学习Ruby的经历记录与此。

0. HelloWorld

任何语言都是从HelloWorld开始,Ruby也不另外.

puts "Hello Ruby World."

纳尼,就这一句?没错!!! 看看输出:

StarnetdeMacBook-Pro:ruby starnet$ ruby helloworld.rb 
Hello Ruby World

1. 语法

  • 如果 Ruby 在行尾遇到运算符,比如 +、- 或反斜杠,它们表示一个语句的延续
  • Ruby 标识符的名称可以包含字母、数字和下划线字符( _ )
  • « 多行字符串
print << (此处不应有空格) EOF
    This is the first way of creating
    here document ie. multiple line string.
EOF
  • BEGIN 在程序之前执行
BEGIN {
   code
}
  • END 在程序之后执行
END {
   code
}
  • #为注释符号

2. 变量

  • $ - 全局变量
$: 默认搜索路径
$! 最近一次的错误信息
$@ 错误产生的位置
$_ gets最近读的字符串
$. 解释器最近读的行数(line number)
$& 最近一次与正则表达式匹配的字符串
$~ 作为子表达式组的最近一次匹配
$n 最近匹配的第n个子表达式(和$~[n]一样)
$= 是否区别大小写的标志
$/ 输入记录分隔符
$\ 输出记录分隔符
$0 Ruby脚本的文件名
$* 命令行参数
$$ 解释器进程ID
$? 最近一次执行的子进程退出状态
  • @ - 类实例成员变量
  • @@ - 类变量
  • 大写 - 常量
  • :: - 域
  • : - symbol
    • 名字相同, Symbol 相同
    • 名字不同, Symbol 不同
  • 伪变量
self: 当前方法的接收器对象
true: 代表 true 的值
false: 代表 false 的值
nil: 代表 undefined 的值
__FILE__: 当前源文件的名称
__LINE__: 当前行在源文件中的编号

3. 逻辑代码段

  • if…else
if conditional [then]
	  code...
[elsif conditional [then]
	  code...]...
[else
	  code...]
end
  • if
code if condition
  • unless…else = if反义
unless conditional [then]
   code
[else
   code ]
end
  • unless
code unless conditional
  • case
case expression
[when expression [, expression ...] [then]
   code ]...
[when expression [, expression ...] [then]
   code ]...
...
[else
   code ]
end
  • while
while conditional [do]
   code
end
code while condition
或者
begin 
  code 
end while conditional
  • until - while反义
until conditional [do]
   code
end
code until conditional
或者
begin
   code
end until conditional
  • for
for variable [, variable ...] in expression [do]
   code
end
  • redo
for i in 0..5
   if i < 2 then
      puts "Value of local variable is #{i}"
      redo
   end
end
  • retry
begin
   do_something # 抛出的异常
rescue
   # 处理错误
   retry  # 重新从 begin 开始
end
  • do
(expression).each do |variable[, variable...]| code end

4. 方法与块

  • 方法
def method_name [( [arg [= default]]...[, * arg [, &expr ]])]
   expr..
end
method_name [arg ...]
block_name{
   statement1
   statement2
   ..........
}

yield 表示{} 在块中,您可以在两个竖线之间放置一个变量来接受参数

def test
   yield 5,10
   puts "You are in the method test"
   yield 100,200
end
test {|i,j| puts "You are in the block #{i}, #{j}"}

5. << self 理解

查考这里 ruby在任何时间任何地点,可以对一个类或对象打开进行添加方法或者重写方法 其本质是ruby在任何地方能对一个既存的对象打开也是基于类的,只不过是个匿名的内部类而已,而这个类继承于当前实例的类

于是 « self 可以理解为重写self的类方法

class Hello
    class << self
        def hello
            puts 'hello'
        end
        def hello1
            hello
            puts 'hello1'
        end
    end  
    def hello2 
        Hello.hello
        puts 'hello2'
    end
    def self.hello3
        Hello.hello
        puts 'hello2'
    end
end
Hello.hello
Hello.hello3
h = Hello.new
h.hello2