初识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最后一行代码默认是返回值