在类方法中使用yield时,会让函数挂起,返回yield后面的值给块并执行块语句,执行完后继续返回函数,继续往下执行,函数执行结束,默认返回最后一行,有return的话,就返回return后的值,无值默认返回nil。
类方法定义:self.method 或者 类名.method; 实例方法:直接method 。类不能直接调用实例方法;
# block_given?判断是否存在 block ,可以在不带块去调用函数不报错继续执行。
- 局部变量以小写字母或下划线开头
- 全局变量以$开头
- 实例变量以@开头
- 类变量以@@开头
- 常量或类名以大写字母开头
符号类型的特点:相同标识符表示的符号在任何地方引用的都是一个相同的实例,符号的唯一性。符号创建: 在:后面加上一个标识符即可创建一个符号。
nil 关键字表示空集,ruby逻辑判断只有nil&&false表示假,其他都是真包含0;
=begin ... =end ...可以放多行文字,不被解释,表示多行注释
对象冻结后,freeze 使用或修改对象会报错,但重新创建对象不会报错。
dup/clone/=都是浅复制。当是浅复制,是复制引用,即复制了他的内存地址,当修改原地址,复制地址不变,当不改原地址只是修改值,复制地址的值会跟着变化。
查看内存地址 obj.object_id 可以看到
继承 < 拓展 <<:附加
别名: alias 新名字 旧名字 新方法指向旧方法,当调用新旧方法时候就都会指向旧方法,但是!!!如果,旧方法被覆盖重新定义,调用旧方法时会直接调用新定义的旧方法,从而执行新定义的旧方法的代码。
对象序列化: 内置模块Marshal模块可方便地进行对象序列化以及还原操作,Marshal.dump方法将对象序列化生成一串字符串。Marshal.load(Marshal.dump(obj))
extend/include区别:include ,导入模块方法变成实例方法,extend 导入模块方法变成类方法,并且所有对象都可以extend模块方法而获得其方法。
加载和混入模块:
require 保证模块只被加载一次,而load会重新加载代码,load,require都会对被加载的文件的局部变量不会加载。
upcase/downcase 大小写方法
undef function/remove_method 动态删除方法,前者删除比较彻底,会将父类的方法也删除,后者不会删父类方法 remove_const 删除常数 ps| remove_method/const 是私有方法,只能在类和模块中使用
异常处理:
begin
rescue exception1/2/3
ensure 出错必执行
end
遍历: enum.find(ifnone=nil){|obj| block} 寻找集合符合条件元素,遍历数组给block,返回第一个匹配的元素,若无,返回ifnone参数
enum.all?{|obj|block}判断集合所有的元素是否满足某条件,若条件块没返回false/nil,则返回true,否则是false
enum.any? 同上,不过只要一个元素满足就是true
enum.collect{|obj|block} 每个元素调用块,返回数组
enum.each_with_index{|obj,i| block} 传入2参数,执行block语句
enum.inject(initial = nil){ |memo|, object| block } 遍历集合,累计block结果,将每一步block结果替换成memo, 如指定initial,则memo初始值为initial值,否则以第一个元素值为memo初始值,并且第一元素不迭代.
enum.partition{|i| i %2 == 0} 返回[[2,4],[1,3,5]] 将集合按条件分割,返回两个数组,第一数组包含让block为真的元素,另一个含有集合使block为假的元素;
enum.max 返回集合最大元素 假如是字符串,则根据字符串的字母进行排序
enum.max{|a,b| block} 自定义比较语句的block
enum.min、enum.min{|a,b| block}与max同理,不过找最小
enum.sort、enum.sort{|a,b| block} 让集合进行排序 enum.sort_by {|obj|block} 根据某规则对集合元素进行排序
.. 闭合区间,...前闭后开区间,
a,b,c,d = [1,'a',[1,2],(1..5)] 这是一个快速并行赋值的方法,可以简化代码
| 并集,<< 追加元素 ; * 重复数组,如果*之后是整数,返回重复整数次数的数组,如果*之后是字符串,则重复使用该字符串连接数组。*之后不能为负数,小数默认成整数进行匹配。
delete(obj) 删除的是对象,pop/shift(num),删除的是个数,从后/前开始删,delete_at(index) 删除的是指定下标位置; delete_if{|item| block} 删除制定条件(使block返回true)的元素。
compact:返回数组副本,删除其中nil元素,副本 和原数组内存地址不同。等价于深拷贝。
flattern: 如果数组中包含元素有数组,该数组会不断递归合并,返回一个只包含基本元素的数组。
index(obj):返回obj的下标
insert(index,obj) ,join(obj)同python
散列: hsh.delete(key) hsh.delete_if{|key,value| block}: 删除指定条件散列的元素,执行将会删除使block 返回值为true的元素。
hsh.has_key?(key) hsh.has_value?(val) hsh.index(val) :返回散列值等于val的键,hsh.invert:返回逆转散列的键和值的新散列,逆转散列键值。
hsh.keys:返回散列键组成的数组,hsh.values:返回散列值组成的数组,hsh.value_at(keys):返回给定键对应的值组成的数组。
hsh.length:返回散列中元素的个数,hsh.merge(other_hash):合并两个散列,如有重复键,将使用other_hash中对应的值覆盖hash中的值。
hsh.replace(other_hash):使用other_hash中的值替换hsh中相同键的值。
hsh.to_a:将散列转换为数组。以每一个键值对生成一个数组。嵌套在数组里。
查找和迭代:hsh.find_all{|key,value| value <15} 查找所有小于15的元素
hsh.map{|key,value| "#{key}-#{value}"} 返回元素键和值生成的数组
hsh.sort 按值排序 hsh.sort_by{|key,value| key} 按键排序
hsh.each do |key,value| 散列迭代键值,也可以仅对键或值进行迭代,|key| or |value|
str.gsub(pattern, replacement) 字符串替换功能。将左边的字符替换为右边的字符。
两个对象之间进行比较时,ruby,会直接判断不能比较。虽然值一样,但是内存地址不一样,会返回false。
提示:1.常量也可以修改,不过会有警告;