文章目录
- 什么是Ruby?
- 官方网站
- 作者介绍
- ruby安装
- Windows(本次操作的环境)
- ruby简单运行
- 定义一个函数
- 定义一个对象
- 面向对象的类操作
- instance_methods
- respond_to 和 send
- 数组操作
- Ruby中的<<和>>的作用详解
- 数组定义
- 数组循环
- 数组连接
什么是Ruby?
Ruby 是一种面向对象、指令式、函数式、动态的通用编程语言。在20世纪90年代中期由日本计算机科学家松本行弘(Matz)设计并开发。
遵守BSD许可证和Ruby License[10][注 1]。它的灵感与特性来自于Perl、Smalltalk、Eiffel、Ada以及Lisp语言。由Ruby语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的Ruby语言替代品。
官方网站
https://www.ruby-lang.org/zh_cn/
作者介绍
松本行弘(まつもとゆきひろ)
ruby安装
https://www.ruby-lang.org/zh_cn/downloads/
Windows(本次操作的环境)
- Linux/Unix
- MacOS
- 推荐Homebrew
ruby简单运行
irb # 进入命令行
10+20
10*10
Math.sqrt(9)
puts "hello ruby! hello world!!!"
定义一个函数
- 定义一个函数 :
def sayHello()
puts "hello word!!!"
end
sayHello
- 传一个参数
def sayHello(parameter)
puts "hello word!!! #{parameter}"
end
sayHello('i am parameter')
- 给一个默认值
def sayHello(parameter='default parameter!')
puts "hello word!!! #{parameter}"
end
sayHello
定义一个对象
class Learning # 类名首字母必须大写
def initialize(name="yanilo") # 初始化函数,当对象被实例化时会被首先执行的函数,(构造函数)
@name = name # 类变量,能被该类或者子类继承使用
end
def show()
puts "Learning: class name ==> #{@name}!!!"
end
end
qwq = Learning.new()
qwq.show()
qwq = Learning.new("yanilo_test_1")
qwq.show()
qwq = Learning.new("yanilo_test_2")
qwq.show()
面向对象的类操作
nstance_methods
(all:bool): 列出对象(类)内部的方法
- false 只显示自定义的类方法
- true 显示所有的类方法 default=true
respond_to?
: 检查对象的方法/属性是否可用send
:执行对象的方法
instance_methods
列出对象(类)内部的可用方法,用于调查解析对象的使用。有点像python的dir但没有这么全
class Game
def initialize(title="罪恶王冠", player, price)
@title = title
@player = player
@price = price
end
def show()
puts "welcome to #{@title}!"
puts "hello #{@player}"
end
def battle()
puts "#{@player} aunched a war at a price of #{@price}"
puts "#{@player} 以#{@price} 的代价发动了一场战争!"
end
end
puts Game.instance_methods
puts "======================"
puts Game.instance_methods(false)
respond_to 和 send
通过 respond_to? 和 send 这两个方法,我们可以构造更灵活和稳定的程序,一般用于动态生成的类方法调用等操作
class Game
def initialize(title="罪恶王冠", player, price)
@title = title
@player = player
@price = price
end
def show()
puts "welcome to #{@title}!"
puts "hello #{@player}"
end
def battle()
puts "#{@player} aunched a war at a price of #{@price}"
puts "#{@player} 以#{@price} 的代价发动了一场战争!"
end
end
game = Game.new(player='yanilo','50')
methods = "show"
if game.respond_to?(methods) # 判断对象是否存在show方法
game.send(methods) # 执行指定的方法
game.send("battle") # 执行指定的方法
end
数组操作
Ruby中的<<和>>的作用详解
- << 和 >>代表左移或右移
puts 1<<2
- 输出结果为:4
代表1的二进制向左移动4位,即x<<y,x*2**y。平时用不到这种方法 - 字符串拼接
test = "hello"
txt = " yanilo"
puts test<<txt
- 数组添加元素
ar = Array.new
ar << 3
puts ar
- 输出结果为:[3]
字符串拼接和数组添加元素不能使用>>
数组定义
list_data = ['a','b',2,'你好!']
数组循环
list_data = ['a','b',2,'你好!']
# each循环数组
list_data.each do |qwq|
puts qwq
end
# 带索引循环数组
list_data.each_with_index do |data,index|
puts "index:#{index},data:#{data}"
end
# for循环数组
for i in list_data do # 在for循环中 do 可以省略不写
puts i
end
puts '*************'
## 知识拓展
"""
for和each的区别主要在于:
for是通过调用each实现,因此for更慢一些
for会在each的scope之外创建一个局部变量,这在某些情况下会引发问题
"""
# puts list_data
a = []
for n in [1, 2, 3] do # 在for循环中 do 可以省略不写
a << Proc.new {puts "#{n}"}
# proc 可以理解是一段能执行的代码,相当于你在函数中插入一段断码
# Proc.new 创建一个新的代码块
end
[1, 2, 3].each do |m|
a << Proc.new {puts "#{m}"}
end
a.each { |p| p.call } # => 3 3 3 1 2 3
# p.call执行代码块
# for 循环中 相当于一个对象(nil);
# 很显然,for循环的结果不是我们所期待的,因此,结论就是:应该尽可能的使用each替代for循环。
重点: 应该尽可能的使用each替代for循环。
数组连接
list_data = ['a','b',2,'你好!']
puts list_data.join("_")
输出结果为:a_b_2_你好!