文章目录

  • 什么是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语言替代品。

ruby能干嘛 ruby有什么用_Ruby

官方网站

https://www.ruby-lang.org/zh_cn/

作者介绍

松本行弘(まつもとゆきひろ) 

ruby安装

https://www.ruby-lang.org/zh_cn/downloads/

Windows(本次操作的环境)

ruby能干嘛 ruby有什么用_ruby_02


ruby能干嘛 ruby有什么用_ruby_03


ruby能干嘛 ruby有什么用_ruby能干嘛_04

ruby能干嘛 ruby有什么用_ruby能干嘛_05

  • Linux/Unix
  • MacOS
  • 推荐Homebrew

ruby简单运行

irb   # 进入命令行
10+20
10*10
Math.sqrt(9)
puts "hello ruby! hello world!!!"

ruby能干嘛 ruby有什么用_ruby_06

定义一个函数

  • 定义一个函数 :
def sayHello()
    puts "hello word!!!"
end
sayHello

ruby能干嘛 ruby有什么用_Ruby_07

  • 传一个参数
def sayHello(parameter)
    puts "hello word!!! #{parameter}"
end

sayHello('i am parameter')

ruby能干嘛 ruby有什么用_ruby_08

  • 给一个默认值
def sayHello(parameter='default parameter!')
    puts "hello word!!! #{parameter}"
end

sayHello

ruby能干嘛 ruby有什么用_数组_09

定义一个对象

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()

ruby能干嘛 ruby有什么用_ruby_10

面向对象的类操作

  • 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)

ruby能干嘛 ruby有什么用_Ruby_11

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能干嘛 ruby有什么用_ruby能干嘛_12

数组操作

Ruby中的<<和>>的作用详解
  1. << 和 >>代表左移或右移
puts 1<<2
  1. 输出结果为:4
    代表1的二进制向左移动4位,即x<<y,x*2**y。平时用不到这种方法
  2. 字符串拼接
test = "hello" 
txt = " yanilo" 
puts test<<txt
  1. 数组添加元素
ar = Array.new 
ar << 3  
puts ar
  1. 输出结果为:[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循环。

ruby能干嘛 ruby有什么用_数组_13

数组连接
list_data = ['a','b',2,'你好!']
puts list_data.join("_")

输出结果为:a_b_2_你好!