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/
松本行弘(まつもとゆきひろ)
https://ja.wikipedia.org/wiki/Ruby
https://www.ruby-lang.org/zh_cn/downloads/
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): 列出对象(类)内部的方法
respond_to?
: 检查对象的方法/属性是否可用
send
:执行对象的方法
列出对象(类)内部的可用方法,用于调查解析对象的使用。有点像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 这两个方法,我们可以构造更灵活和稳定的程序,一般用于动态生成的类方法调用等操作
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
puts 1<<2
输出结果为:4test = "hello"
txt = " yanilo"
puts test<<txt
输出结果为:hello yaniloar = 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循环。
list_data = ['a','b',2,'你好!']
puts list_data.join("_")
输出结果为:a_b_2_你好!