Ruby基础笔记

代码文件编码
.rb使用utf-8编码
#encoding: utf-8

基本类型
数字
Fixnum 可以容纳比本机字节长度少一位
Bignum 仅收到内存限制

进制前缀
0 八进制
0d 十进制
0x 十六进制
0b 二进制

在ASCII字符前面加?可以得到对应的字符数值

浮点数 基本不分float 带小数点就是浮点数

字符串
''不进行替换
""可以进行#{v}的替换

\a bell/alert
\b backspace
\e escape
\f
\n newline
\r return
\s space
\t tab
\v vertical tab


正则表达式
/pattern/
/pattern/option
%r{pattern}
%r{pattern}options
Regexp.new{'pattern'[, option]}

命名规则
ruby 使用一种命名他管理来区分名称的用途: 名称的第一个字符显示这个名称如何被使用
局部变量 方法参数和方法名称都必须以小写字母或者下划线开始 rails中使用了小写字母开头
全局变量使用美元符号($)为前缀
实例变量使用@开始
类变量使用2个@符号开始(静态变量???)
最后类名称,模块名称和常量都必须以一个大写字母开始

puts "sdfsdf"
puts作用的副作用,会先在目前的屏幕上打印出来,之后才返回字符串常量值
puts会在输出字符串之后添加一个"\n"

print 之上两点都不会

字符串方法
"".empty? 测试字符串是否为空

所有的object包括函数都可以调用to_s方法,包括nil,来返回一个字符串

nil.to_s
""
nil.to_s.empty?
true

测试一个对象是否为空nil?
"foo".nil?
false
"".nil?
false

nil.nil?
true


基本上所有ruby的对象的布尔值都是真 ,只有nil是false
包括0也是真
if 0
true
else
false
end
true


数组常用方法
a.sort
a.sort! bang改变了数组的内部数据
a.shuffle
a.reverse

"foo bar a".split
["foo", "bar", "a"]

"fooxbarxa".split('x')
["foo", "bar", "a"]

a=[42, 8, 17 ,7, "foo", "bar"]
a.join
"428177foobar"

a.join(',')
"42,8,17,7,foo,bar"


range 和 数组
(0..9).to_a 由range生成一个数组 包括9
(0...9).to_a 由range生成一个数组 不包括9

a=%w[foo bar baz quux] #创建一个元素为字符串的数组
["foo", "bar", "baz", "quux"]

('a'..'e').to_a
["a", "b", ... "e"]

block
(1..5).each do |number| #针对range
puts 2* number
puts '--'
end
其中 do ~ end之间就是一个block 它接受|number|作为传入的参数 之后做puts的操作

3.times { puts "abc" } #针对单个次数
其中{}就是一个block
默认单行block就使用{} 多行的话就使用do end 并且{}优先级较高

(1..5).map { |i| i**2 } #针对range或者数组

 1 def call_back
 2     yield
 3     yield
 4 end
 5 def call_back
 6     yield
 7     yield
 8 end
 9 
10 call_back { puts "in block"}
11 call_back { |i| print "#{i}\n" }

 

hash 和 symbol
h1 = { :name => "abc", :email => "xxx@gmail.com"}
h2 = { name : "abc", email: => "xxx@gmail.com"} #新形式,逐渐推荐使用
h1 == h2
true
其中 :name 叫做symbol 可以看做是一个没有约束的字符串,symbol当比较的时候,不需像字符串一样逐个字符进行比较,所以是hash的key的不二选择


flash = { success:"it works!", error:"it failed"}
flash.each do |key, value| #调用了hash的each方法
puts "key #{key.inspect} has value #{value.inspect}"
end

inspect 返回一个数组的字符形式
puts (1..5).to_a
1
2
3
4
5

puts (1..5).to_a.inspect
[1,2,3,4,5]

因为inspect输出对象的方式经常使用,为此还有一个专门的快捷方式 p
p :name #等价于 puts:name.inspect
:name


s="foobar" #默认构造函数调用
s.class #返回类的类型
String

s = String.new("foobar") #使用类名.new来生成一个类
"foobar"
s.class
String
s == "foobar"
true

a = Array.new([1,3,2])
[1,3,2]

h = Hash.new #注意hash如果给new函数参数,则这个参数的值是给未初始值得默认值
{}
h[:foo]

h = Hash.new(0)
{}
h[:foo]
0 #初始值的默认值变成了0

mass assignment

mixin
module Trig
PI = 3.14 #模块中定义常量
def Trig.sin(x) #模块中定义函数
end
def Trig.cos(x)
end
end

使用
require 'trig'
y=Trig.sin(xxxxz)

mix in
使用sha256保存密码
salt = Array.new(10){ rand(1024).to_s(36) }.join
hashed_password=Digest::SHA256.hexdigest(pass+salt)

ruby的自省
程序能够在程序内部检查程序自己的方方面面,这种能力叫做反射 也叫内省
在内省的时候可能发现如下信息
包含哪些对象
类的层次结构
对象的属性和方法
有关方法的信息

irb中直接load example.rb
然后可以直接调用example.rb中的方法

Symbol和String的互转
String#to_sym() String#intern()
Symbol#to_s() Symbol#id2name()

异常处理
begin
rescue e
#失败时候抛出异常e
ensure
#此处无论成功失败都执行
end

posted @ 2014-07-15 08:03  AssassinPig  阅读(109)  评论(0编辑  收藏  举报