Ruby简介
Ruby是一门面向对象函数式编程脚本语言。Ruby是20世纪90年代由日本人日本人松本行弘开发,于1995年12月正式发布。命名是借鉴Perl以6月诞生石pearl(发音相同)命名方式,以7月诞生石ruby(红宝石)命名。宗旨是为了让程序员快乐地编码。
Ruby的设计原则
- 简洁性
- 扩展性
- 稳定性
Ruby的特点
- 动态语言
- 弱类型
- 面向对象
- 函数式
Ruby的优点
- 语法简单,遵守面向对象特征
- 支持操作符重载
- 支持迭代器
- 支持闭包
- 支持混入类(mixins)
- 垃圾回收,开发人员不用关注内存管理
- 跨平台,支持类UNIX,支持Dos,Windows, MacOS等平台
- 适合快速开发,开发效率是Java的5倍
Hello world
在hello_world.rb文件写下如下代码、保存,注意一定要以rb做后缀。
puts "hello world"
然后,打开终端,cd到文件路径下,执行 ruby hello_world.rb 即可看到输出"hello world"。hello world程序体现了脚本语言的便利。
所有类型都是对象
Ruby里所有的类型都是对象,这点类似swift。
tmp = 3
puts tmp.class
输出:Integer
Numeric - 数值类型, Integer、Float, Double等父类
String - 字符串
str = "string"
Hash - 字典
hash = {:a => "a"}
puts hash[:a]
Array - 数组
array = ["a","b","c"]
puts array[0]
类
声明
class Test
end
类变量 && 类实例变量
@@name: 定义名为name的类变量。可以被继承,可以被子类继承,值是该类和所有子类共享。
@name: 定义名为name的类实例变量。不可以被继承,值是该类独占。
类变量和类实例变量都不能在类外面访问。
class TestA
@@name = "A类变量"
@name = "A类实例变量"
def self.desc
puts @@name
puts @name
end
end
class TestB < TestA
@@name = "B类变量"
@name = "B类实例变量"
end
输出:
B类变量
A类实例变量
B类变量
B类实例变量
属性
类似Objective里的@propert,可以在类外面访问,声明如下
class TestA
attr_accessor :name
end
对比property 有如下三种
- attr_accessor: getter setter
- attr_reader: getter
- attr_writer: setter
类方法 && 实例方法
方法定义如下,写在类里就是实例方法。若在方法名前添加"self."即是类方法。
def {方法名}
end
完整Demo
class TestA
@@class_name = "A类变量"
@instance_name = "A类实例变量"
attr_accessor :name
attr_reader :gender
def initialize(name)
@instance_name = name
end
def self.desc
puts "类描述:"
puts @@class_name
puts @instance_name
end
def desc
puts "实例描述:"
# puts gender
puts @instance_name
end
def gender
return "female"
end
def instance_name
@instance_name
end
def + x
puts desc
puts x.desc
end
end
class TestB < TestA
@@class_name = "B类变量"
@instance_name = "B类实例变量"
end
puts "==== 类变量和类实例变量 ===="
TestA.desc
TestB.desc
puts "==== 类实例变量 ===="
TestA.new("AA类实例变量").desc
TestB.new("BB类实例变量").desc
puts "==== 华丽分割线 ===="
TestA.desc
TestB.desc
puts "==== 类实例变量 ===="
puts TestA.new("AA类实例变量").instance_name
puts "==== 属性 ===="
test_a = TestA.new("AA类实例变量")
test_a.name = "zzh"
puts test_a.name
操作符重载
Ruby支持操作符重载,以下是重载"+"的例子
class A
attr_accessor :value
def value
return 10
end
def + x
return value + x.value
end
end
puts A.new + A.new
输出:
20
迭代器
Hash && Array 迭代器
array.each do |v|
puts v
end
hash.each do |key, value|
# to_s 转成字符串
puts key.to_s + ":" + value.to_s
end
闭包
yield关键字,后面可以带参数
def map(number)
yield number
end
map(10) { |e| puts (e * e) }
输出:100
Proc是块对象
inc = Proc.new { |x| puts (x * x ) }
inc.call(10)
输出:100
混入类mixins
可以在class里注入module,class里就能共享module里的方法和属性
module Fly
def fly
puts "Can fly"
end
end
class Bird
include Fly
end
Bird.new.fly
输出:
Can fly