术:4个ruby小技巧
2019-10-26 本文已影响0人
稻草人_b788
一、4个ruby小技巧
(一)nil转数组
有时候对于nil对象,我们希望转成数组来处理,这样进行each循环时便不会报错。
nil转数组可以用三种方法:
1.使用Array()方法
Array(nil)
=> [nil]
2.使用to_a方法
nil.to_a
=> []
3.使用[*]
方式将对象转成数组
[*nil]
=> []
[*1]
=> [1]
[*1..5]
=> [1, 2, 3, 4, 5]
补充说明:
使用[*]
和Array都有一个好处,就是可以把单个对象和数组用同样的方式进行操作,此外这两种方式还可以对各种集合类型、hash以及range进行操作:
a = 1 #单对象
b = [1,2,nil] #数组
[*a] #*操作单对象
=> [1]
[*b] #*操作数组
=> [1, 2, nil]
Array(a) #Array操作单对象
=> [1]
Array(b) #Array操作数组
=> [1, 2, nil]
[*'a'..'e'] #*操作range
=> ["a", "b", "c", "d", "e"]
Array(1..5) #Array操作range
=> [1,2,3,4,5]
Array({k: 1})
=> [[:k, 1]]
[*{k: 1}]
=> [[:k, 1]]
{k: 1}.to_a
=> [[:k, 1]]
(二)使用Hash方法接收参数构建散列
使用Hash方法并传入参数可以构建散列,传入的参数必须是偶数个,如果传入的参数是奇数个则会报错
按照顺序每两个参数将构成一个键值对,第一个参数作为key,第二个参数作为value。
例如:
h = Hash["a","b"]
=> {"a" => "b"}
m = Hash["a","b",:c,"d"]
=> {"a"=>"b", :c=>"d"}
拓展运用
假如这里有一个文件,其中的内容有姓名和国家,但它不是ruby能直接识别的数据结构,我们要把它先转成ruby能识别的数据结构,然后将其中的姓名和国家和相应的人员做成散列形式:
line = "first_name=david;last_name=black;country=usa" #文件的原始内容
record = line.split(/=|;/) #将内容按照=或;进行分割
=> ["first_name", "david","last_name","black","country","usa"]
再将上述的数据进行进一步加工,转成散列形式:
data = []
element = Hash[*record] #使用*将上面获取的数组转成裸列表,作为参数传给Hash方法,从而构建散列
=> {"first_name"=>"david", "last_name"=>"black", "country"=>"usa"}
data.push(element)
=>[{"first_name"=>"david", "last_name"=>"black", "country"=>"usa"}]
(三)使用双星**接收hash格式的参数
在方法的参数列表中,单星*
表示将参数作为数组来接收,而双星**
则表示将参数作为hash散列来接收
例如:
def hello(a,*b,**c)
p a,b,c
end
hello(1,2,3,a: 1,b:2)
#1 参数a的值
#[2, 3] 参数b的值
#{:a=>1, :b=>2} 参数c的值
=> [1, [2, 3], {:a=>1, :b=>2}]
(四)数组转参数列表
数组可以通过前面加上星号*
转成参数列表
例如:
a = [1,2]
def count_num(x,y)
return x + y
end
count_num(*a) #将数组a转成了参数列表,分别赋值给了x和y
=> 3