ruby基础教程目录页面:
25 目录
39 正文开始
与方法有关的知识
方法名以小写开始,可以以?/!/= 这三种特殊符合结尾
? 通常表示查询的方法名以?结尾,一般返回true/false值,当然,根据ruby的原则,除false和nil以外的值都转化为true.
! 危险的或会修改接受者对象内容的方法以!结尾;普通的方法在修改值时一般都是拷贝后再修改,而!方法则是直接在原来的数据上修改。其实在《代码大全2》中就明确表示:再不影响程序的情况下尽量不要修改传入方法的原始数据。
= 表示可以被赋值的方法,比如说类中的属性必须具有以=结尾的同名方法才能让外部修改其值,类似于set方法;通过此种方式也可以设置虚属性,因为此种方法的本身其实就是将传入的数据赋予内部的某个字段(ruby中的实例变量默认的访问基本为private,也就是说,外界无法通过实例访问,其默认只能接受无接收这对象的访问,也就是所谓的内部访问),但事实上外部是不会关心内部的具体实现的,程序员可以在内部为其进行自定义实现。
文档注释
为文档添加额外的注释有两种方法
1.在注释行前添加#
2.使用=begin ... =end 块,并在begin 后添加 rdoc 以区分。
3.给类添加文档注释时应使用#
4.#-- 表示从此处开始停止处理注释。
5. #++ 表示从此处开始重新开始处理注释。
命名
全局变量以$开头,类变量是@@, 实例变量是@,局部变量首字母小写,常量首字母大写,类名/模块名首字母小写,方法名首字母小写
多单词:类/模块以首字母大小的方式隔开;其他则以下划线。
关于ruby中的类与对象
ruby中的自定义类(未特别说明则下同)本质上全部都是class类的实例对象。
也就是说:
1.类方法其实就是class类的实例方法。
2.因为类方法属于类级别的,在class类的角度来说,其实就是class类的对象的单例方法。
所以说:
添加一个类方法其实就是添加一个class的实例方法;不过虽然说可以这样理解,不过添加的class的实例方法却不是公用的,不同的实例对象有不同的方法。
类与模块与min-ax
主要的关键字:include / extends
include 以实例的方法将模块引入;也就是说,引入的模块中的方法/数据只能以实例的方法调用。
extends 以类方法的形式引入模块;
=================================RUBY 元编程 ==============================================
2.2 动态方法调用
可以使用Object的send()方法代替.符合来调用实例方法
obj = MyClass.new
obj.send(:my_method,3)
第一参数方法名,后面的参数是方法的参数。
动态定义方法
define_method :method_name do |x|
end
一. 祖先链
class < module < object < kenler < ObjectBasic
1.1 查询祖先链
ancestors() => 获取继承关系列表
superclass() => 返回父类
============================RUBY 编程语言================================
1 单键方法
其实就是简单意义上来说的动态方法,只不过和《RUBY 元编程》中所说的动态方法不同而已,所以这里叫单键方法。
主要是针对某个已经实例化的对象为其添加一个独立于对象的实例方法。
name = 'xxx'
def name.charse #方法声明
puts ''
end
name.charse
2 取消方法定义
通过使用undef 语句取消实例方法或全局方法(没有在类中定义的方法),但对于单键方法无效。
def xx end;
undef xx();
另外,单独取消子类的实例方法,比如当你希望子类不继承父类的某个方法时可以考虑。
3 操作符方法
在ruby 中 +,-,*,/,数组[] 之类的操作符都是通过方法的形式定义的,所以大多数操作符都是可以自定义的,这一点与传统编程语言不同。
特例: 一元加 =》 +@
一元减 =》 -@
3 方法别名
在ruby中,一个方法可以拥有多个别名,但多个方法不能公用一个名字
4 方法的圆括号
4.1 可省略的括号
在ruby中,方法的括号大多数时候都是可省略的。按照惯例,当没有或只有一个参数时不使用括号,当有多个参数时一般会加上括号。
当然,在不设计到参数的嵌套访问时同样可以省略括号,此时方法名后的全部都被认为是方法的参数,第一个参数应与方法名空一格,参数之间通个逗号分割。
4.2 不可省略的括号
当方法的参数调用发生嵌套调用时就必须使用括号为其修改优先权,嵌套的深度越深,优先越高。
当使用括号时,左括号应与方法名紧邻,不允许有空格。
五 方法参数
5.1 方法参数的默认值。
在ruby1.8 中默认值参数必须出现在普通参数后,但在ruby1.9之后允许:只要默认值参数是连续的,则不必强制其出现在普通参数之后。
默认值参数的填充是从左往右,可以允许手动指定参数一,默认参数二,但不允许默认参数二,手动指定参数一。
def test(author,title='xx', address='xxx', context)
end
5.2 可变长度参数
在参数的前面添加一个*符号,这个参数代表数组,包含传入到这个参数中的零或多个值。但是
在 ruby >= 1.9 中,要求其必须放置在默认参数之后,再之后可以有普通参数,但必须在&参数之前,并且此类型的参数只允许存在一个。
def test(a, b='b', c='c', *d, e, &f)
end
ps: *符号昵称 =》 splat操作符
5.3 给方法传递数组参数
*符号最主要的一个功能是 展开 。将* 放在参数前则表示此参数可以或需要展开来运算,不过是形参(parameter)还是实参( argument )。
ps: 这个符号的功能很强大。
================
六 关于模块
书籍参考 《programmin ruby》第九章
模块特点:
1.通过命名空间实现沙箱机制。
2.模块名与常量名类似,以大写字母开始。
3.方法定义与类中的方法定义相似。
4.模块中的方法类似于类方法,模块不是类,不能实例化,所以模块中没有实例方法。
5.模块不能被继承。
6.使用普通的def 关键字定义的方法只能被模块自身和包含此模块的上下文引用。
7.模块中也可以使用ruby中的实力变量,但为了防止命名冲突的问题,一般尽量不用。
引用模块:
1.如果模块和当前引用的地方不在一个文件中则需要使用require '' 将其引用。
2.在类或模块中通过使用include引用模块。
3.当使用include引用多个模块时,后引用的模块拥有优先权。
常用特性:
1.通过使用include?方法判断类是否包含模块。
2.在类对象上引用Object#extend方法可以把模块中的方法一单例方法的形式扩展到类对象上
module a
def xx
puts 'haha'
end
end
str = '我爱你'
str.extend(a)
str.xx #=> haha
3.在类中,通过extend 语句将模块方法引用为类的类方法,通过include 引用为实例方法。
class user
include moduleA #=> 实例方法引用
extend moduleB#=> 类方法引用
ps: 2/3参考《Ruby 基础教程第4版》第8.9章节。
模块定义方法:
1.使用def 关键字定义方法,此方法只能被模块自身和包含此模块的上下文引用,引用方法为 ‘模块名.方法名 ’。
2.如果需要使模块方法可以被除上面情况的其他类或模块访问的话,需要使用module_function 声明。
def xx
end
module_function :xx
3.
------------------
模块中使用实例变量:
1.由于模块是公用的,很有可能会出现实例变量名命名冲突的问题,可以考虑添加前缀。
module xx
def age
@age=12
end
end
===================
七 关于文件引用与包含
ruby 中的文件引用主要由 load() 和 require() 负责。
load() 的特点:
1.每一次执行都会无条件的重新加载文件。
require() 的特点:
1.可以加载二进制库。
2.可以通过绝对或相对路径加载。
3.在1.9中,即便是相同的文件,但只要加载的路径不同也会单独加载的。
================
八 类
8.1 创建可变类
通过使用Struce 类可以生成其他类。
如果把一个未命名的类对象赋予一个常量,则这个常量就成为该类的名字。
=========================Ruby or rails========================
持久化数据至数据库
第一中
user = User.new
user.save #=> 返回true or false
第二种
user = User.create(name: '', title: '', context: '') #=>返回