ruby基础用法简单整理
基础变量部分
-
变量声明
<pre> a = 10 a = "string"</pre> -
支持并行赋值
<pre> a,b = 3,5 a,b = 3, "5"
a = b = 3</pre> -
变量操作
<pre> a += 1
没有++操作符号</pre> -
变量交换
<pre> a,b = 3,5
a,b = b,a #=> 5,3</pre> -
语句后面不跟";"
<pre> a = 10</pre> -
/
<pre> -5 / 2 #=> -3
-5.0/ 2 #=> -2.5</pre> -
%
<pre> -5 % 2 #=> 1
-5 % 2.2 #=> 1.6</pre>
字符串
-
声明
<pre> str = "string"</pre> -
切片操作
<pre> str[1...3] #=> "tr"
str[1,3] #=> "tri"</pre> -
倒叙
<pre> str[-1] #=> "g"</pre> -
字符串比较
<pre> if(str == sub) #=> true</pre> -
字符替换
<pre> str[3] = "1" #=> "str1ng"</pre> -
字符串*
<pre> str *3 #=> "stringstringstring"</pre> -
字符串+
<pre> str + "s" #=> "str1ngs"</pre> -
字符串长度
<pre> str.length str.size str.bytesize #=> 7</pre> -
汉字
<pre> str = "人"
str.length str.size #=> 1
str.bytesize #=> 1</pre> -
数字转字符串
<pre> str = "a is "
a = 10.0
str + a.to_s #=> "a is 10.0"</pre> -
数组<<
<pre> str << "es" #=> stringes
str << ?5 #=> string5
str << 5 #=> string�</pre> -
字符串内复值
<pre> sum = 5
str = "string #{sum}" #=> "string 5"
str = "string #{sum} is %d %s" % [5,"sum"] #=> "string 5 is 5 sum"</pre>
数组
-
声明
<pre> arr = [1,2,3,4]
other = 1,2,3,4
a,b,c = [1,2,3] #=> a = 1 b =2 c =3
a ,*b= [1,2,3,4] #=> a =1 b = [2,3,4]
*a ,b= [1,2,3,4] #=> a =[1,2,3] b = 4</pre> -
支持多元数组
<pre> other = [1,2,3,4,"str"]</pre> -
数组下标起始位置
<pre> arr[0] #=> 1</pre> -
数组切片
<pre> sub = arr[1...3] #=> 1,2 [1,3)
sub = arr[1,3] #=> 1,2,3 [1, =>3长度</pre> -
倒叙
<pre> arr[-1] #=> 4</pre> -
数组比较
<pre> sub = [1,2,3,4]
if(arr == sub) #=> true</pre> -
数组元素替换
<pre> arr[2] = "d" #=> [1,2,"d",4]
arr[1,3] = ["a","b"] #=> [1, "a", "b"]</pre> -
数组*
<pre> arr * 3 #=> [1,2,3,4,1,2,3,4,1,2,3,4]</pre> -
数组+
<pre> arr + [5] #=> [1,2,3,4,5]
arr + [[5,6]] #=> [1, 2, 3, 4, [5, 6]]</pre> -
数组长度
<pre> arr.length arr.size #=> 74</pre> -
数组= #=>两数组维持同一份拷贝
<pre> sub = arr #=> [1,2,3,4]
arr[2] = "d" sub #=> [1,2,d,4]</pre> -
Array数组深拷贝
<pre> sub = Array.new(arr)
if(sub == arr) #=> true
arr[2] = "d" sub #=> [1,2,3,4]</pre> -
越界操作方式
<pre> arr[6] = 5 #=> [1, 2, 3, 4, nil, nil, 5]</pre> -
range对数组的初始化
<pre> ('1'...'5').to_a #=> ["1", "2", "3", "4"]</pre> -
切片赋值
<pre> arr[1...2] = ["a"] arr #=> [1, "a", 3, 4]
arr[1,2] = ["a"] arr #=> [1, "a", 4]</pre> -
数组减法
<pre> sub = [1,2,3,4,5,6]
sub - arr #=> [5, 6]</pre> -
数组<<
<pre> arr << 5 #=> [1, 2, 3, 4, 5]</pre> -
数组&
<pre> sub = [1,3,5]
arr & sub #=> [1, 3]</pre> -
数组|
<pre> sub = [1,3,5]
arr | sub #=> [1, 2, 3, 4, 5]
sub | arr #=> [1, 3, 5, 2, 4]</pre> -
数组遍历
<pre> arr.each {|x| print x} #=> 1234</pre>
hash
-
初始化
<pre> nums = {:one=>1, :two=>2,:three=>3} #=> {:one=>1, :two=>2, :three=>3}
sums = hash.new
sums[1] = 1 #=> {1=>1}
sums = {"1"=>1, 2=>2} #=> {"1"=>1, 2=>2}</pre> -
支持多元hash
<pre> nums = {:one=>1, :two=>"2"} #=> {:one=>1, :two=>"2"}</pre> -
获取hash元素
<pre> nums[:one] #=> 1</pre> -
元素替换
<pre> nums[:one] = 3 #=> {:one=>3, :two=>2}</pre> -
hash长度
<pre> nums.length nums.size #=> 3</pre>
range
-
初始化
<pre> range = 1..100 #=> 1..100</pre> -
include? && member? && cover? 判断
<pre> range.include?10.0 #=> true
range.include?10 #=> true
range.include?101.0 #=> false</pre>
符号
-
respond_to?
<pre> class Greeter
def add x, y
x + y
end
endgt = Greeter.new
gt.respond_to?:add #=> true</pre> -
string转符号
<pre> puts str.to_sym str.intern #=> add</pre> -
符号转string
<pre> sign = :add
sign.to_sym sign.id2name #=> add</pre> -
instance_of? is_a? kind_of?
<pre> gt = Greeter.new
gt.instance_of? Greeter #=> true
gt.is_a? Greeter #=> true
gt.kind_of? Greeter #=> true</pre> -
class
<pre> gt.class #=> Greeter</pre> -
==
<pre> a = "Ruby"
b = a
c = "Ruby"a == b #=> true
a == c #=> true
a[1] = "3"
a== b #=> true</pre> -
equal?
<pre> a.equal?b #=> true
a.equal?c #=> falsea[1] = "3"
a.equal?b #=> true</pre> -
eql?
<pre> a.equal?b #=> true
a.equal?c #=> truea[1] = "3"
a.eql?b #=> true</pre> -
<=>
<pre> 1 <=> 3 #=> -1
3 <=> 3 #=> 0
4 <=> 3 #=> 1</pre>
条件式
-
if条件
<pre> if a == b
"code"
endif "expr"
"code"
elsif "expr"
"code"
else
"code"
endif "expr" then
"code"
end"code" if "expr" #不允许有elsif else 等从句</pre>
-
unless
<pre> unless "expr"
"code"
end"code" unless "expr" #不允许有elsif else 等从句</pre>
-
case
<pre> case
when "expr" then "code"
when "expr" then "code"
when "expr" then "code"
else "many" then "code"
end</pre> -
until while
<pre> until "expr" do
"code"
end"code" while "expr"</pre>
-
for
<pre> for a in array
"code"
end </pre> -
times
<pre> 3.times "code" #=>0,1,2</pre> -
each
<pre> data.each{|x| puts x}</pre> -
map
<pre> [1,2,3,4].map {|x| puts x}</pre> -
upto/downto
<pre> 4.upto(7) { |x| print x} #=> 4567</pre> -
inject
<pre> sum = data.inject {|result , x| x +result} #=> 10</pre> -
yield
<pre> def five
yield 1,2,3,4,5
endfive do |x,*y,z|
print x #=> 1
print y #=> [2,3,4]
print z #=> 5
end</pre>
方法
-
函数
<pre> def func x
return x
end</pre> -
多返回值
<pre> def func x
x
enddef func
return 1 , 2
enddef func
[1 , 2]
end</pre> -
单键方法
<pre> o = "message"
def o.func x
x
end</pre> -
可以定贷带问号结尾的函数
<pre> def empty
"code"
end</pre> -
可以用变参
<pre> def max(first, *res)
max = first
res.each{
|x| max = x if x > max
}
max
end
puts max 1,2,3,4,5 #=> 5</pre> -
默认参数
<pre> def sum x,y = 2,z = 3
x + y + z
end</pre> -
hash函数
<pre> def sequence args
n = args[:n]
m = args[:m]
c = args[:c]
a = []
n.times {|i| a << m*i+c}
a
endputs sequence({:n=>3,:m=>5,:c=>1})
puts sequence :n=>3,:m=>5,:c=>1 (裸hash)</pre> -
代码块
<pre> def sequence n ,m ,c
i = 0
while i < n
yield i * m + c
i+= 1
end
endsequence(5,2,2) {|x| puts x } #=> 2,4,6,8,10</pre>
-
proc对象
<pre> def makeProc &block
block
endblock = makeProc {|x| puts x }
block.call(3) #=> 3</pre> -
proc.new
<pre> block = Proc.new {|x| puts x }
block.call(3) #=> 3</pre> -
lambda表达式
<pre> lambda = ->x{puts x }
lambda.call(3) #=> 3</pre> -
lambda表达式默认参数
<pre> lambda = ->x =3{ y = x + 1; puts y }
lambda.call #=> 4</pre>
类
-
声明(类名必须大写否者报错)
<pre> class Point
def initialize(x,y)
@x,@y = x,y
enddef x; @x; end def y; @y; end def x=value; @x = value; end def y=value; @y = value; end
end
p = Point.new 3,5</pre>
-
枚举坐标值
<pre> class Point
def initialize(x,y)
@x,@y = x,y
enddef each yield @x yield @y end
end
p = Point.new 3,5
p.each {|x| print x} #=>3,5</pre> -
定义==
<pre> def == o
if o.is_a?Point
@x ==o.x && @y == o.y
elsif
false
end
end</pre> -
定义严格版eql?
<pre> def eql? o
if o.instance_of?Point
@x.eql?(o.x) && @y.eql?(o.y)
elsif
false
end
end</pre> -
读写性
<pre> attr_reader :x,:y 只读
attr_accessor :x,:y 读写</pre> -
Struct方法创建类
<pre> Poi = Struct.new(:x,:y)
po = Poi.new(3,5)
puts po.x</pre> -
拥有private,public,protected的类可见性
<pre></pre> -
单例方法
<pre> o = Point.new 3,5
def o.sayBye
puts "byebye!"
endo.sayBye #=> "byebye!"</pre>
-
单利方法的另外一种模式
<pre> class << o
def sayHi
puts "Hi"
end
end</pre> -
单例方法查询
<pre> puts o.singleton_methods #=> sayBye</pre> -
使用self定义的静态方法
<pre> class SelfTest
def self.test
puts "hello world selfTest."
end
endSelfTest.test #=> "hello world selfTest."</pre>
-
使用类名定义的静态方法
<pre> class SelfTest
def SelfTest.test
puts "hello world selfTest."
end
endSelfTest.test #=> "hello world selfTest."</pre>
-
send调用方法
<pre> class Base
attr_accessor :xdef initialize x @x = x end def add x ,y x + y end
end
o = Base.new 3
puts o.send(:add,3,7) #=> 10</pre> -
module
<pre> module Model
def sayHello
puts "hello world!"
end
endclass Base
include Modeldef initialize x @x = x end
end
o = Base.new
o.sayHello #=> "hello world!"</pre>
反射,元编成
-
class superclass 反射
<pre> class Base
attr_accessor :xdef initialize x @x = x end def log puts @x end
end
o = Base.new 3
puts o.class #=> Base
puts o.class.superclass #=> Object</pre> -
eval求值
<pre> a = 100
puts eval "a +1"</pre>
正则表达式
<pre> if "Ruby" =~ /[R,r]uby/
puts "true"
end</pre>
集合
-
遍历切片遍历
<pre> (1...10).each_slice(3) {|x| print x} #=> [1, 2, 3][4, 5, 6][7, 8, 9]</pre> -
滑动切片遍历
<pre> (1...10).each_cons(3) {|x| print x} #=> [1, 2, 3][2, 3, 4][3, 4, 5][4, 5, 6][5, 6, 7][6, 7, 8][7, 8, 9]
</pre>
网友评论