Ruby基础
2016-03-29 本文已影响51人
yaya_pangdun
1、数组和散列表
a = ['ant', 'bee', 'cat', 'dog']
a = %w{ant bee cat dog}
inst_section = {
'cello' => 'string',
'clarinet' => 'woodwind',
'drum' => 'percussion',
'oboe' => 'woodwind'
}
$greeting = "Hello world" #全局变量
2.block的使用
['cat', 'dog', 'horse'].each {|name| print name}
3.times {print 'i'} # 0,1,2
3.upto(6) {|i| print i} #3,4,5,6
('a'..'e').each {|char| print char}
##############如何调用block#####################
def call_block
puts "begin the method"
yield("hello", 1)
yield("hello", 2)
puts "end the method"
end
call_block {|greet, time| puts "#{greet}, #{time}"}
#begin the method
#hello, 1
#hello, 2
#end the method
################################################
def block_test
if block_given? #函数后面给block了
yield "give the block"
else
puts "give no block"
end
end
##############block其他方式########################
def call_block(&block)
block.call
end
#&代表的是块转变为Proc(block to proc conversion)
call_block {puts "block的另一种调用"}
p = Proc.new {puts "block的其他调用"}
call_block(&p)
##################map函数用法#####################
name_list = ["chareice", "angel"]
name_list.map(&:upcase) # => ["CHAREICE", "ANGEL"]
3.类
class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
def to_s
"Song : #{@name}--#{@artist} (#{@duration})"
end
end
song = Song.new("Bicy", "Fleck", 260)
puts song.to_s
继承
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
def to_s
super + "[#@artist]"
end
end
get方法
def name
@name
end
def artist
@artist
end
def duration
@duration
end
get更简单的方式
attr_reader :name, :artist, :duration
set方法
def duration=(new_duration)
@duration = new_duration
end
set更简单的方法
attr_writer :duration
4.类方法
class SongList
MAX_TIME = 5 * 60
def SongList.is_too_long(song)
return song.duration > MAX_TIME
end
end
5.单例模式
class MyLogger
private_class_method :new #private的类方法
@@logger = nil
def Mylogger.create #def self.create
@@logger = new unless @@logger
@@logger
end
class <<self #类方法的第三种方式
def create
@@logger = new unless @@logger
@@logger
end
end
end
⬆对比private_class_method
class MyTest
def print_hello
puts "hello"
end
private :print_hello #private实例方法
end
6.类的访问控制
在Ruby中对象的方法默认是public,Ruby中一切都是对象,对象之间赋值采用的是引用传递
7.容器类
数组
a = [1, 3, 5, 7, 9]
a[1, 3] ->[3, 5, 7]
a[1..3] ->[3, 5, 7]
a[1...3] ->[3, 5]
8.实现管理song的容器
class SongList
def initialize
@songs = Array.new
end
def append(song)
@songs.push song
self
end
def delete_first
@songs.shift
end
def delete_last
@songs.pop
end
def [](index)
@songs[index]
end
end
实现查找
def with_title
@songs.find {|song| title == song.name}
end
#查找到第一个就返回
inject方法
[1, 3, 5, 7].inject(0) {|sum, element| sum+element}
[1, 3, 5, 7].inject(1) {|product, element| product * element]
block做闭包回调
class Button
def initialize(label, &action)
@action = action
@label = label
end
def button_pressed
@action.call(self)
end
end
button = Button.new("play") {puts 'play the music'}
#将后面的block传给&action
常见的迭代器
3.times {print "X "}
1.upto(5) {|x| print x, " "}
(1..5) {|x| print x}
99.downto(90) {|x| print x, " "}
50.step(80, 5) {|x| print x, " "}
document生成字符串
string = <<END_OF_STRING
The body of the string
is the input lines up to
one ending with the same text '<<'
END_OF_STRING
字符串处理
#chomp去除行末的换行符
file, length, name, title= string.chomp.split(/\s*\|\s*/)
name.squeeze!(" ") #去除多余的空格,留一个(!),不带!空格全去除
区间
digits = 0..9
puts digits.include?(5)
puts digits.min
puts digits.max
puts digits.reject {|i| i<5}
digits.each {|digit| print digit}
(0..9).to_a
正则表达式
a = Regexp.new('^\s*[a-z]')
if line =~ /perl|python/
puts "Scripting language mentioned:#{line}"
end
匹配之后Ruby会设置一些变量
$& ->模式匹配的那部分字符串
$` -> 匹配之前的那部分字符串
$' -> 匹配之后的那部分字符串
不定参数
def log(*infos)
infos.each {|info| puts info}
end
符号和字符串
"name".to_sym() #:name
:name.to_s() #"name"
类型判断
:name.is_a?(Symbol) #true
"name".is_a?(String) #true
重磅方法
带"!"方法返回的对象本身,普通方法返回的是对象的拷贝
9. 对象的内存
per1 = "Tim"
per2 = per1 #别名
per1[0] = 'J' #per2 == "Jim"
per1 = "Tim"
per2 = per1.dup #复制
per1[0] = 'J'
per1 -> "Jim"
per2 -> "Tim"
per = "Tim"
per.freeze
per[0] = 'J' #raise a TypeError
10. 计算数组的维度
module ObjectExtension
refine Object do
def dimension
return 0 if self.class != Array || self.empty?
max = 0
self.each do |a|
t = a.dimension
max = [max, t].max
end
max + 1
end
end
end
using ObjectExtension
puts [1,[124,4], [1,2,3]].dimension
11. 技巧
songDuration = "2:58"
mins, secs = songDuration.split(/:/)
mins, secs = songDuration.scan(/\d+/)
12. 可选参数
#params={}可以替换成**params
def advance_search(key_words, params={})
default_params = {
page: 1,
paging_size: 20,
mode: 'text'
}
params = default_params.merge params
puts params
end