Ruby语法

268 阅读6分钟

Ruby是一种脚本语言,Cocoapods就是使用Ruby开发的。在iOS开发中,掌握Ruby对于项目工程化,自动化很有帮助。

终端运行方式

运行Ruby最常见的两种方式是ruby命令和irb命令:

  1. ruby命令方式:创建test.rb文件,在终端输入ruby test.rb就会执行该文件中的代码了。
  2. irb命令方式:在终端输入irb,然后按回车键,出现irb(main):001:0>及可输入ruby代码了,按回车键执行,Ctrl + d退出。如果无法输入中文,重新打开终端后,输入irb --noreadline

集成开发环境(IDE)

1. VSCode

下载Visual Studio Code, 安装Code runner extension插件。运行方式有两种:

  1. CTRL + ALT + N
  2. Cmd + Shift + p, 输入Run By language, 再输入Ruby即可运行

2. RubyMine

RubyMine地址:www.jetbrains.com/ruby/。25元获取RubyMine官方账号:taojingling.cn/Jet/account…。运行方式如下图:

image.png 创建test.rb文件,编写好代码。确认编号2处是要运行Ruby文件,点击编号3处的运行就可以了,编号4处是输出的结果。使用RubyMine有很多方便之处,比如可以自定义工作目录,设置好环境变量等等。下图就是自定义工作目录的方法,右键->More Run/Debug->Modify Run Configuration就会显示下图对话框:

image.png

Ruby编码设置

使用# encoding:来指定编码,如:# encoding: ASCII, # encoding: UTF-8UTF-8在Windows下对应GBK

# encoding: UTF-8

注释

注释有两种:#开头会注释一行,注释多行用=begin=end

# 注释一行

=begin
注释多行
注释多行
注释多行
=end

变量

Ruby 支持五种类型的变量。

  • 一般小写字母、下划线开头:变量(Variable)。
  • $开头:全局变量(Global variable)。
  • @开头:实例变量(Instance variable)。
  • @@开头:类变量(Class variable)类变量被共享在整个继承链中。
  • 大写字母开头:常数(Constant)。

全局变量

#!/usr/bin/ruby
# encoding: UTF-8
 
$global_variable = 10
class Class1
  def print_global
      puts "全局变量在 Class1 中输出为 #$global_variable"
  end
end
class Class2
  def print_global
      puts "全局变量在 Class2 中输出为 #$global_variable"
  end
end
 
class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global

实例变量

实例变量以 @ 开头。未初始化的实例变量的值为 nil,在使用 -w 选项后,会产生警告。

#!/usr/bin/ruby
 
class Customer
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
    end
end
 
# 创建对象
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
 
# 调用方法
cust1.display_details()
cust2.display_details()

类变量

类变量以 @@ 开头,且必须初始化后才能在方法定义中使用。

引用一个未初始化的类变量会产生错误。类变量在定义它的类或模块的子类或子模块中可共享使用。

在使用 -w 选项后,重载类变量会产生警告。

#!/usr/bin/ruby
 
class Customer
   @@no_of_customers=0
   def initialize(id, name, addr)
      @cust_id=id
      @cust_name=name
      @cust_addr=addr
   end
   def display_details()
      puts "Customer id #@cust_id"
      puts "Customer name #@cust_name"
      puts "Customer address #@cust_addr"
    end
    def total_no_of_customers()
       @@no_of_customers += 1
       puts "Total number of customers: #@@no_of_customers"
    end
end
 
# 创建对象
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
 
# 调用方法
cust1.total_no_of_customers()
cust2.total_no_of_customers()

Ruby 局部变量

局部变量以小写字母或下划线 _ 开头。局部变量的作用域从 class、module、def 或 do 到相对应的结尾或者从左大括号到右大括号 {}。

当调用一个未初始化的局部变量时,它被解释为调用一个不带参数的方法。

对未初始化的局部变量赋值也可以当作是变量声明。变量会一直存在,直到当前域结束为止。局部变量的生命周期在 Ruby 解析程序时确定。

Ruby 常量

常量以大写字母开头。定义在类或模块内的常量可以从类或模块的内部访问,定义在类或模块外的常量可以被全局访问。

常量不能定义在方法内。引用一个未初始化的常量会产生错误。对已经初始化的常量赋值会产生警告。

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
class Example
   VAR1 = 100
   VAR2 = 200
   def show
       puts "第一个常量的值为 #{VAR1}"
       puts "第二个常量的值为 #{VAR2}"
   end
end
 
# 创建对象
object=Example.new()
object.show

伪变量

它们是特殊的变量,有着局部变量的外观,但行为却像常量。您不能给这些变量赋任何值。

  • self  当前方法的接收器对象。
  • true  代表 true 的值。
  • false  代表 false 的值。
  • nil  代表 undefined 的值。
  • __FILE__  当前源文件的名称。
  • __LINE__  当前行在源文件中的编号。

字符串

字符串打印

字符串用双引号或单引号表示,如"hello ruby!\n"\n代表换行。单引号表示的话,\n字符不会转译,会直接输出:

image.png

字符串中传递参数

使用#{}包裹参数名:

A = 100
print("Hello Ruby! #{A}\n")

方法的声明和调用

声明

方法以do开头,end结尾,也可以用{}代替。一般一行代码使用{},多行使用do end:

require "fileutils"

$success_file_name = "successLog.txt" 
$fail_file_name = "failLog.txt"

def write_log(fail, success)
    if success != 0
        file = File.new($success_file_name, "a")
        file.syswrite("#{success}\n")
    end
    if fail != 0
        file = File.new($fail_file_name, "a")
        file.syswrite("#{fail}\n")
    end
end

调用

Ruby在方法调用时,()可以省略,如上边提到的print ("hello,ruby!\n")就可以写成print "hello,ruby!\n"print就是要方法,字符串"hello,ruby!\n"是参数。

打印(输出方法)

方法还有putsp,前者会自动在打印后换行。后者用来区分数值和字符串,并且不会转译,会返回输出结果:

image.png

条件判断

Ruby中使用true和false来表示真假,另外nil也表示假。除false和nil外都为真。

条件判断中,经常会用到逻辑运算符:&&||

判断对象是否是同一个对象用equal?方法,判断对象的值是否相等用eql?

按照Ruby的开发习惯,返回true或false的方法名都以?结尾。

Ruby中常见的条件判断包括:if语句,case语句,unless语句。如下:

# encoding: UTF-8

a = 1
b = 2

if a > b then
  p "a大于b"
elsif a == b then
  p "a等于b"
else
  p "a小于b"
end

case a
when 1 then
  p "a等于1"
when 2 then
  p "a等于2"
else
  p "a不等于1且不等于2"
end

unless a > b then
  p "a大于b"
else
  p "a小于或等于b"
end

then可以忽略

循环

常用循环有forwhiletimes循环:

a = [1, 2, 3, 4, 5]
for num in a do
  print num #==> 12345
end

i = 0
while i < 10
  print i #==> 0123456789
  i += 1
end

3.times do
  print "test" #==> testtesttest
end

break, next, redo语句用在循环中。break结束循环,next跳过本次循环,redo重复上次循环。redo基本用不上:

array = [1, 2, 3, 4, 5]
array.each do |num|
  if num == 3
    break
  end
  print num
end
#==> 12

array = [1, 2, 3, 4, 5]
array.each do |num|
  if num == 3
    next
  end
  print num
end
#==> 1245

对象

Ruby中所有数据都是对象,如数值对象,字符串对象,数组对象,散列对象,正则表达式对象,文件对象,符号对象。

而类就是对象的种类,反过来,对象就是类的实例。比如数值对象就是Numeric的实例。

环境变量

Unix中,使用 env 命令来查看所有环境变量的列表:

image.png