类
Ruby中一切都是对象,包括一个常数.
比如可以用.class属性来查看一个对象的类型,你可以看下1.class,会发现常数1的类型是Fixnum,1不过是Fixnum的一个实例。
Ruby中的类以class开始 以end结束,类名首字母的约定是大写。
Ruby中的方法以def开始 以end结束,方法名首字母的约定是小写。
Ruby中的局部变量名首字母的约定是小写。
Ruby中的构造函数名称为initialize。
Ruby中的成员变量(实例变量)前导@符,在initialize里进行声明与初始化。
Ruby中的属性用attr, attr_reader, attr_writer, attr_accessor。
Ruby中的全局变量前导$符。
Ruby中的常数(常量)用大写字母开头,约定是全部大写。
initalize方法
当Ruby创建一个新对象时,它总是会寻找一个名为 initialize 的方法并执行它.因此,我们可以简单通过一个initialize方法向实变量中加入缺省值。
class Person
def initialize()
puts "hello!"
end
# def initialize #()省略一样
# puts "hello!"
# end
#参数默认值
# def initialize (param = "1900lab") # 参数带有默认值
# puts "hello! " + param
# end
#可变长参数
def youInput(*names)
puts "input #{names.join(",")}!"
end
end
p = Person.new()
和 p = Person.new 一样,没有参数()可以省略。
属性
目的是快速生成读写方法
attr :attr1, key
attr_reader :attr1, :attr2
attr_writer :attr1, :attr2
attr_accessor :attr1, :attr2
attr 一般后跟一个符号参数, 第二个参数是一个 bool 参数,用于指示是否为符号参数产生写方法。它的默认值是 false,只产生读方法,不产生写方法。
attr_reader 一般后跟一个符号参数,定义一个或多个只读的属性,用于指示为符号参数产生读方法。
attr_writer 一般后跟一个符号参数,定义一个或多个只写的属性,用于指示为符号参数产生写方法。
attr_accessor 一般后跟一个符号参数,定义一个或多个可读写的属性,用于指示为符号参数产生读写方法。
为什么要用 符号
我们可能会有疑问,为什么 attr 后面要用符号呢(冒号:+ 变量)?
其实我们不用符号也可以的
class Person
attr "name",true
end
p = Person.new()
p.name = "xiao ming"
puts p.name
我们需要知道
符号是不可改变的字符串,也不可被GC的
在大多数情况下,接受符号作为参数的方法也能接受字符串,反过来不成立;
每个符号在对象空间中只出现一次,用符号要比用字符串省内存
为什么Ruby runtime可以保证每一个symbol唯一?
这是因为Ruby把symbol存放在运行时维护的一个符号表里了,而这个符号表实际上是一个atom数据结构,其中存储着当前所有的程序级的name,确保不出现内容相同的多个对象。几乎每一个语言和系统都会有这样一个符号表,只不过象C/C++那样的语言,这个符号表只是在编译时存在,运行时就没了。而Python、Ruby则在运行时也保留这张表备用。
为什么用符号
只所以用符号不用字符串,我想主要是内存和效率这两个方面吧。
Ruby中两个内容相同的字符串文本量实际上是两个不同的对象。
a = "hello"
b = "hello"
虽然俩字符串内容都一样,但是你比一下a和b,就知道a.object_id != b.object_id,它们指向的不是同一个对象。
如果用字符串的话,p.name = "xiaoming" 和 p.name = "小红" 就可能占用2倍的内存。
效率方面可能就是为了避免多次动态生成字符串吧。