Ruby way第一章学习记录[Ruby的OOP]

所有的东西都是对象
=================================
3.succ                  # 4
"abc".upcase           # "ABC"
[2,1,5,3,4].sort       # [1,2,3,4,5]

查看对象的类型:
"abc".class    #得到类型为String。等同"abc".type,不过type方法将过期

所有对象都有一个标识其唯一性的整数:
"abc".object_id   #等同"abc".id,不过id方法将过期


Ruby的内建类
==================================
Ruby有超过30个的内建类,另外,Ruby是单继承的语言。

new方法是通常用来实例化对象的:
myFile = File.new('my_file.txt','w')
myStr = String.new('hello,ruby')

以上不是必须的,我们可以这样来实例化:
myStr = "hello,ruby"
myNum = 4


Ruby的字符串
===================================
Ruby的字符串是mutable的,它不像java中的字符串(创建后不能更改,相同的字符串维护的是同一个实例)。
a = "hello"
b = "hello"
a.object_id #21627900
b.object_id #21627890
可以看出,同样的字符串,Ruby会生成不同的实例(这样,同样的字符串出现几此,就要占用几倍的内存空间,这也是为什么在rails中,大量采用ruby symbol而不用字符串来作为

hash键来改善性能的原因,具体情况,请google或baidu一下)。不过凡事总有两面性,Ruby的字符串这样设计虽然有它不好的一面,但也有好的一面,对字符串的可操作性就是它

的优点。

str = "abc"
str.gsub(/b/,'xyz')  #axyzc
str       #abc

str.gsub!(/b/,'xyz') #axyzc
str       #axyzc

想要让Ruby字符串变为immutable,可以使用freeze方法
str.freeze
str.gsub!(/b/,'xyz')  #会发生错误


Ruby的Modules和Mixins
====================================================
在一个类中使用include,可以把一个module中的方法变为这个类的实例方法;
使用extend,则可以把一个module中的方法变为这个类的类方法:

module MyModule
  def test
    puts "hello,module!"
  end
end

class MyClass

  include MyModule
 
end

MyClass.new.test

#######################
class MyClass2

  include MyModule

end

MyClass2::test


load和require:
================================================
load是在当前调用点插入目标文件中的代码或二进制资源,使其在插入点生效。
require和load差不多,只是如果已经装载过的话,则不再作装载。

 

创建自己的类
=================================================
一个典型的Ruby类的创建:
class MyClass

  NAME = "Class Name"  # class constant

  def initialize       # called when object is allocated
    @@count += 1
    @myvar = 10
  end

  def MyClass.getcount # class method
    @@count            # class variable
  end

  def getcount         # instance returns class variable!
    @@count            # class variable
  end

  def getmyvar         # instance method
    @myvar             # instance variable
  end

  def setmyvar(val)    # instance method sets @myvar
    @myvar = val
  end
  def myvar=(val)      # Another way to set @myvar
    @myvar = val
  end
end

foo = MyClass.new      # @myvar is 10
foo.setmyvar 20        # @myvar is 20
foo.myvar = 30         # @myvar is 30

有四个方法可以用来自动处理实例的数据访问:attr,attr_accessor,attr_reader,attr_writer,它们的参数都是使用symbol。

以上类中的相应数据访问可以使用这样简单的形式来实现:
attr_accessor :myval
(其实它自动生成了myval和myval=两个方法,来获取或设置@myval实例变量)


类的访问控制
==================================================
Ruby的类有private,protected和pulic这三个访问控制级别(类中的方法默认为public,除了initialize方法是private的[它通常被new方法来调用]),使用方法:

1.定义好方法,然后用private :methodname来作控制,如:
class MyClass
    def test
       "hello,world"
    end
 
    private :test
end

2.在方法定义前加private
class MyClass
    private
    def test
       "hello,world"
    end
 
    #之后定义的方法都为private,直到出现另外的访问控制方法
end


类的继承:
class ChildClass < SuperClass
end

super是用来访问父类的关键字

alias 可以给方法起别名,如:
class Test
 
  def test
    puts "aaaaaaaaa"
  end
 
  alias testx test
 
end

Test.new.testx


方法的可变参数
==================================================
用*定义的参数部分,可以接受不定个数的参数(以Array的形式存放)
def mymethod(a, b, *c)
  print a, b
  c.each do |x| print x end
end

mymethod(1,2,3,4,5,6,7)    # a=1, b=2, c=[3,4,5,6,7]



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值