Ruby基础知识-2.基本数据类型
1.1 整数(Integer)
整型分两种,如果在31位以内(四字节),那为Fixnum实例。如果超过,即为Bignum实例。
可以通过num.to_s将整数转化为字符串。
指数操作符**。
puts 3**3 #27
操作符<=>比较大小。例如:a<=>b,若a大于b时返回正数,若相等时返回0,若小时返回负数。
1.2 浮点数(Float)
(1)浮点数的类. Float与C语言的double相同,其精度要看环境而定。
浮动数采用近似表示,例如0.1可能会存储为0.099999999999999…。
puts 0.3-0.2==0.1 #false
(2)可以通过truncate删除小数部分将其变为整数。
puts 5.3.truncate #5
(3)可以通过num.to_s将浮点数转化为字符串。
1.3 字符串
定义方法:
1.3.1字符串型可以用单引号或双引号表示。
两种表式方法双引号推荐使用:双引号转义字符全;双引号中的字面量可以包含表达式。
1.3.2可以通过一对字符串分界符来定义字符串字面量。
分界符成对出现的,例如:(),[],{},两个!!。如果使用!做为分界符,其中字面量中又出现了!号,那么,需要\!来转义。当然,如果其中的字面量中出现了成对的分界符(其实是做为操作符出现的),那不需要转义的。
%q用于单引号规则,%Q用于双引号规则。
例如:%q(2*(1+1))内容等效于'2*(1+1)',%Q(2*(1+1))内容等效于"2*(1+1)"。
1.3.3 使用<<=Header定义一段字符串
例如:
s4=<<Header
first line
second line
third line
Header
字符串操作:
(1)用+号进行字符串连接。
对于不是字符串的需要to_s方法进行显示转换,才能用于连接。连接后的字符串会新建一个对象返回。
(2)用<<号进行字符串连接。
此操作符连接字符串,是修改左侧字符串,而不新建对象。
(3)用*号表示重复左侧字符串。
"ab"*3=="ababab"
(4)[index, length]用于字符串截取或替换。
puts "abcdef"[1,2]
(5)[index1..index2]通过range截取子字符串。
puts "abcdef"[1..3]
(6)通过索引字符串,来判断包含关系。
例如:puts "abcdef"["abc"]
(7)大小写转换
例如:puts "abcdef".upcase
(8)字符串输出
name1 = "Joe"
name2 = "Mary"
puts "Hello %s, where is %s" % [ name1 , name2 ]
puts "Hello #{name1}, where is #{name2}"
1.4 数组
1.4.1 数组定义
arr1 = []
arr2 = Array.new
arr3 = ['1','2','3']
1.4.2 输出
print arr3,"\n" #123
puts arr3[0] #1
print arr3.join(",") #1,2,3
1.4.3 访问数组元素
arr1[0]
arr1[-1]
arr1.first
arr1.last
arr1.max
arr1.min
arr1.length
arr1.size
1.4.4 数组操作
arr3[4] = '5' #此时arr3[3]默认尾nil
arr3.delete_at(3) #删除指定下标的元素
arr3[2] = ["3a","3b","3c"] #可以这样来做
arr3.delete(["3a","3b","3c"]) #可以删除上面添加的
arr3.push('6') #插入元素
arr3.insert(3,"b") #在指定位置插入新元素
arr3<<"f"<<2 #从左至右一次加入元素
arr3.pop #删除尾元素
arr3.shift #删除首元素
arr3.clear #清空数组
1.4.5 数组运算
aaa = [" aa ",4,5," bb "]
bbb = [4,1,3,2,5]
print aaa + bbb,"\n" # [" aa ", 4, 5, " bb ", 4, 1, 3, 2, 5]
print aaa*2,"\n" #[" aa ", 4, 5, " bb ", " aa ", 4, 5, " bb "]
print bbb - aaa # [1, 3, 2]
print aaa | bbb,"\n" #[" aa ", 4, 5, " bb ", 1, 3, 2]
print aaa & bbb,"\n" # [4, 5]
print bbb.sort,"\n" # [1, 2, 3, 4, 5]
print aaa.reverse,"\n" # [" bb ", 5, 4, " aa "]
print bbb.sort.reverse,"\n" # [5, 4, 3, 2, 1]
1.5 Hash类型
哈希字面量由逗号分隔的kv对来定义,被包括在花括号之间,kv对以=>来定义。推荐使用Symbol定义哈希中的key。因为如果使用字符串时,每个字符串都会生成一个字符串对象,使用Symbol则使用唯一标识。
h1={"a1"=>1,"a2"=>2}
h2={:a1=>3,:a2=>4}
h3={a1:5,a2:6}
puts h1["a1"]
puts h2[:a1]
puts h3[:a1]
Hash使用
(1) value传递方法
cities = { 'CA' => 'San Francisco' ,
'MI' => 'Detroit' ,
'FL' => 'Jacksonville' }
cities [ 'NY' ] = 'New York'
cities [ 'OR' ] = ' Portland'
def find_city ( map , state )
if map.include?state
return map [ state ]
else
return "Not found."
end
end
cities [ :find ] = method ( :find_city )
while true
print "State ? (ENTER to quit) "
state = gets.chomp
break if state.empty?
puts cities[:find].call( cities , state )
end
(2) 作为函数参数
Person.create(name: "John Doe", age: 27)
def self.create(params)
@name = params[:name]
@age = params[:age]
end
(3) 构建默认value值
h = Hash.new {|h,k| h[k] = k*k }
puts h[2]
h2 = Hash.new(10)
#h2.default = 10
puts h2[3]
h.default = proc do |hash, key|
hash[key] = key + key
end
(4) 通过value获取key值
h = { "a" => 100, "b" => 200, "c" => 300, "d" => 300 }
h.key(200) #=> "b"
h.key(300) #=> "c"
(5) 常用方法
删除key
h.delete("z") { |el| "#{el} not found" }
h.delete_if {|key, value| key >= "b" }
遍历Hash
h.each {|key, value| puts "#{key} is #{value}" }
h.each_key {|key| puts key }
h.each_value {|value| puts value }
判断是否存在key或者value
h.has_key?("a")
h4.has_value?(300)
逆转key和value
h = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
h.invert #=> {0=>"a", 100=>"m", 200=>"d", 300=>"y"}
l 选择符合条件的key和value
h = { "a" => 100, "b" => 200, "c" => 300 }
h.select {|k,v| k > "a"} #=> {"b" => 200, "c" => 300}
转换成数组
h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }
h.to_a #=> [["c", 300], ["a", 100], ["d", 400]]
按层次展开
a = {1=> "one", 2 => [2,"two"], 3 => "three"}
a.flatten # => [1, "one", 2, [2, "two"], 3, "three"]
a.flatten(2) # => [1, "one", 2, 2, "two", 3, "three"]