初识Ruby


初识Ruby

Ruby:主要是喜欢让人快乐

第一章、Ruby起步

1、Ruby简介

  • ruby优点

1.Ruby是脚本语言,不需要编译。

2.代码少,效率高

3.不关心变量的类型,非常省心

4.Ruby生产效率极高

  • 学习Ruby的知识点

1.安装、调试、查看api

2.熟悉基本语法

3.熟悉常见的block语法,熟悉rails中的ruby用法

4.熟悉api,遇到问题可以直接搜索

5.不需要看太多 元编程等不常用的知识。

  • 学习过程

1.对于ruby的安装。包括:rbenv,gem,bundler 和镜像

2.对于ruby的基础语法,包括:变量,常量,class,类方法与实例方法

3.数据类型:string, hash,symbol,array,number

4.语句:条件语句(if/else,case/when)循环语句(for/loop/each)

5.各种简写形式,module,常见的元编程,block

6.如何调试ruby,如何查看api

2、Ruby安装

  • 安装依赖
yum install openssl-devel  zlib-devel  -y
  • 安装包安装
ccd /opt/software/
tar -zxvf ruby-2.5.3.tar.gz -C ../app/
cd ruby-2.5.3
./configure --prefix=/usr/local/ruby
make && make install
echo "export PATH=$PATH:/usr/local/ruby/bin" >> /etc/profile
source /etc/profile
ruby -v
  • 测试

新建一个文件

hello.rb

puts 'Hello world'

[root@node01 data]# ruby hello.rb 
Hello world

第二章、Ruby的基本语法介绍

1、数据类型

Number : 1
String : "Jim"
Bool : true,false
Array : [1,2,3]
Hash : {:name => "Jim",:age => 20}
  • 赋值
#ruby 中的变量,不需要做类型声明。直接就用
name = "Jim"

2、各种变量,常量,class的命名规则

  • 常量
#常量全是大写字母:ANDROID_SYSTEM = ‘android’
  • 变量
#如果不算@,@@,$的话,是小写字母开头,下划线拼接
color,age,is_created
  • class,module
首字母大写,驼峰表达法:
Apple ,Human
  • 方法名
小写字母开头,可以以问号?或者等号结尾
name , created?,color=

3、class

作为面向对象语言,class毫无疑问是最重要的,Ruby中的任何变量都是 obiect。(

不像 java int 是基本数据类型,Integer才是 class)

具体的写法:

1、名字的首字母大写

2、class开头,end结尾

3、文件名字与class名称一样。只是改为:下划线 + 小写

  • 写个class的例子【java风格】
class Apple
  #这个方法就是在 Apple.new 时自动调用的方法
  def initialize
  	# instance variable ,实例变量
  	@color
  end
  
  #getter 方法
  def color
    return @color
  end
  
  #setter 方法
  def color = color
    @color = color
  end
  
  #private 下面的方法都是私有方法
  private
  def i_am_private
  end
end

red_apple = Apple.new
red_apple.color = 'red'
puts "red_app.color: #{red_apple.color}"
  • 我们来运行这个文件:
ruby apple.rb
# => "red_apple.color:rea"
  • ruby熟练使用【常用的ruby风格】
class Apple
  #这一句,自动声明了 @color ,getter ,satter
  attr_accessor 'color'
end

4、变量

  • 类变量

class variable ,例如: @@name ,作用域:所有的多个instance 会共享这个变量,用的很少

  • 实例变量

Instance variable 例如:@color 作用域仅在instance 之内,在Rails中被大量使用

  • 普通变量

local variable 例如: age=20,作用域仅在某个方法内大量使用

  • 全局变量

global variable 例如:$name = “Jim”,作用域在全局,用的更少

class Apple
  @@from = 'China'
  
  def color = color
    # instance variable,是不需要声明的
    @color = color
  end
  def color
    return @color
  end
  def get_from
    @@from
  end
  def set_from
    @@from = from
  end
end
  
red_one = Apple.now
red_one.color = 'red'
puts red one.color

red_one.set_from('Japen')
puts red_one.color = 'green'
puts green_one.color

puts green_one.get_from

5、方法

  • 类方法

跟实例无关,可以由class直接调用的方法

  • 实例方法

由某个class的实例调用的方法

class Apple
  #类方法
  def Apple.name
    'apple'
  end
  
  #实例方法
  def color
    'red'
  end
end

Apple.new.color

Apple.name

6、String,Symbol,字符串插值

  • String
single_line = “我是一个字符串”

multiple_line = %Q{
今天天气不错
我想出去走走
}
  • Symbol

不变的值,等同一个常量 :name , :color

  • 字符串插值

在Ruby中,我们最好所有的地方都用字符串插值,避免使用 + 方式。原因:对于不同的数据类型,用+号时系统会报错

puts "hi,#{name}!"
# => hi,jim

你也可以把它写成

puts "hi," + name
# => hi,jim

如果用加号时,一些时候就会报错

a =1
puts "a is : "+a
# => 报错
puts "a is : #{a}"
# => a is : 1

7、Array 与 Hash

  • Array

包含统一数据类型的数组

numbers = [1,2,3]

包含多种类型的数组

[1,'two', :three,{:name => 4}]
  • Hash: key/value
{
  :name => 'Jim',
  :age => 18
  }
hash,也叫dictionary[字典]

同一个hash的三种写法

#任何情况下都生效的语法:
Jim = {
  :name => 'Jim',
  :age => 20
  }
#Ruby 1.9之后更简洁
Jim = {
  name: 'Jim',
  age: 20
  }
#也可以写成
jim = {}
jim[:name]= 'Jim'
jim[:age] = 20

Hash 的 key: symbol 与String 不同

a = {:name => 'Jim','name => 'hi'}
a[:name] #=> 'Jim'
a['name'] #=> 'hi'

8、条件语句,循环语句

1.条件语句 if-else

if a == 1
  puts "a is 1"
elsif a == 2
  puts "a is 2"
else
  puts "a is not in [1,2]"
end

2.case分支语句

a = 1
case a 
  when 1 then puts "a is 1"
  when 2 then puts "a is 2"
  when 3,4,5 then puts "a is in [3,4,5]"
  else  puts "a is not in [1,2,3,4,5]"
end

3.三元表达式

a = 1
puts a == 1 ? 'one' : 'not one'
# => one

4.循环 for,each,loop,while

  • for ,each (前者是关键字,后者是普通方法)
#for 与 each 几乎一样,例如
[1,2,3].each {
  |e|
  puts e
  }
#等同于下方
for e in [1,2,3]
  puts e 
end
  • each 与 for 的区别

for 与 each 都可以做循环,但是高手都用each

区别在于:for是关键字,each是方法。for后面的变量,是全局变量,不仅仅存在于for .. end 这个作用域之内

  • while与loop

while 与 loop几乎一样

loop do
  #your code 
  break if 
end

begin
  #your code
end while 

第三章、Ruby的简写及进阶

1、Ruby中的简写

初学者看到Ruby中的简写立马懵圈了

give "我", :what => '咖啡' ,:count => '2' ,:unit => '杯' do
  "味道不错哟!"
end
  • 简写1:方法调用的最外层括号可省略
puts "hihihi" #等同于 puts("hihihi")
  • 简写2:函数最后一行默认是返回值,是不需要写return的
def color
  'red' #等同于 : return 'red'
end
  • 简写3 :hash

Hash 最外面的{}在大多数情况下可以省略

Apple.create :name => 'apple', :color => 'red'
#等同于:
Apple.create({:name => 'apple', :color => 'red'})
#等同于hash的另一种写法:
Apple.create name: 'apple',color: 'red'
  • 简写4 :调用block
调用某个block中的某个方法:
Apple.all.map {|apple| apple.name}
#等同于:
Apple.all.map(&:name)

2、Module

它用来把各种方法提炼出来,共其它 class 引用

  • 不能被new
  • 可以被 include
  • module中的 self.xx方法可以被直接调用
  • module中的普通方法,需要被某个class include 之后,由对应的class调用
  • tool.rb
module Tool
  #这个方法无法直接运行
  def show_tip
    "this is the tip"
  end
  
  #这个方法可以通过Tool.say 来运行
  def self.say
    "hi"
  end
end

puts Tool.say
  • Mixed in:一种代码重用形式

Mixed in 是一种比继承和 interface/implementaion 更优秀的存在,非常直观,而且很好的重用了代码。

我们来定义两个class,Student 和 Teacher,下面可以看到这两个类,通过include

class Student 
  include Tool
end

Student.new.show_tip # => "this is the tip"

class Teacher
  include Tool
end

Teacher.new.show_tip # =>"this is the tip"

3、元编程

  • 元编程初探

元编程 meta, programming 是一种特别强大的功能

def say_hi_to_jim
  "hi,jim"
end
def say_hi_to_li_lei
  "hi,han_mei_mei"
end
def say_hi_to_han_mei_mei
  "hi,han_mei_mei"
end

这三个方法也可以这样写

['jim',"li_lei","han_mei_mei"].each do |name|
  define_method "say_hi_to_#{name}" do
    puts "hi ,#{name}"
  end
end

然后就可以调用了

say_hi_to_jim # => "hi,jim"
  • 样例1
[1,2,3].each do |e|
  define_method "hi_#{e}" do
    puts "== hi, #{e}"
  end
end
hi_1
hi_2
hi_3
  • 样例2
eval("a =1 ;b = 2;puts a + b")
  • 总结
  • 每个语言都多少有些动态改变代码逻辑的能力,但是Ruby的元编程能力是最强的。用起来也是得心应手
  • ruby元编程可以让我们做到其它传统语言无法做到的事,大家务必知道他的重要性

4、查看API的方式

官方文档:api.ruby-lang.org

5、双冒号语法 ::

  • 标示class的常量
class Interface
  class Apple
    COLOR = 'red'
  end
end

puts Interface::Apple::COLOR

6、代码块(block)

Block,proc,lambda

几乎是一样的,都表示代码块

ruby的代码块是相比其它传统语言特别强大的功能,碾压其他传统语言

  • 例子1
[1,2,3].each {|e| puts e}
#假设student有两个属性 :name,age
Student.all.map {
  |student|
  {
    :name => student.name,
    :age => student.age
    }
  }
  • 例子2
[1,2,3].each do |e|
  # 在 do ...end 之间就是代码块
  puts e
end

block最后一行代码默认是返回值