ruby类总结

2018-04-07  本文已影响0人  will2yang

1.new 实例化对象

ary = Array.new

3. .class查看对象属于哪个类

4. instance_of? 判断对象是否属于某个类

ary = []
str = "Hello world."
p ary.instance_of?(Array)
p str.instance_of?(String)
p ary.instance_of?(String)
p str.instance_of?(Array)
#=> true
#=> true
#=> false
#=> false

5 is_a?

创建类

1.initialize 构造方法

2. @变量: 实例变量

在实例里共用

3.存储器

class HelloWorld
  def name
    @name
  end
  def name=(value)
    @name = value
  end 
end
p bob.name        #=> "Bob"
bob.name = "Robert" #该语句像是给name赋值 其实是调用name=方法
# 简单的定义存储器
attr_reader :name #只读
attr_writer :name #只写
attr_accessor :name #可以读写

4.self

调用方法时,如果省略了接收者,Ruby 就会默认把 self 作为该方法的接收者。因此,即 使省略了 self,也还是可以调用 name 方法,如下所示。

def greet
     print "Hi, I am #{name}."
end

注意,有时候需要显式的使用self,如下:

def test_name
  name = "Ruby" # 为局部变量赋值 self.name = "Ruby" # 调用name=方法
end
  1. 类方法
    方法的接受者为类本身的方法, 几种不同的类方法定义方式
class << HelloWorld
     def hello(name)
       puts "#{name} said hello."
     end
end
HelloWorld.hello("John")   #=> John said hello.

class HelloWorld
  class << self
    def hello(name)
      puts "#{name} said hello."
    end 
  end
end

def HelloWorld.hello(name)
  puts "#{name} said hello."
end
HelloWorld.hello("John")  #=> John said hello.

class 
  def self.hello(name)
    puts "#{name} said 
  end
end

6.常量

class HelloWorld
     Version = "1.0"
end
p HelloWorld::Version    #=> "1.0"

7.类变量

所有类共用一个变量

class HelloCount
  @@count = 0
end

8.方法限制调用

public......以实例方法的形式向外部公开该方法
private......在指定接收者的情况下不能调用该方法(只能使用缺省接收者的方式调用该方法,因此无法从实例的外部访问)
protected......在同一个类中时可将该方法作为实例方法调用

扩展类

1.在原有类基础上添加

class String
  def count_word
    ary = self.split(/\s+/) # 用空格分割self # 分解成数组
    return ary.size # 返回分割后的数组的元素总数 
  end
end
str = "Just Another Ruby Newbie"
p str.count_word            #=> 4

2.继承
super调用父类里 同名的方法

class RingArray < Array
  def [](i)
    idx = i % size
    super(idx)
  end
end

如果 没有指定 父类 Ruby 默认指定 Object 为该类的子类.
但是,我们也有可能会希望使用更轻量级的类,而这时就可以使用 BasicObject 类,但是需要指定使用BaseObejct。

alias与undef

1.alias

 class C1
  def hello
    "Hello" 
  end
end

class C2 < C1
  alias old_hello hello 
  def hello
    "#{old_hello}, again"
  end
end
obj = C2.new
p obj.old_hello  #=> "Hello"
p obj.hello  #=> "Hello, again"

2.undef

undef 用于删除已定义的方法。与 alias 一样,参数可以指定方法名或者符号名。
undef 方法名 # 直接使用方法名
undef :方法名 # 使用符号名
例如,在子类中希望删除父类定义的方法时,可以使用 undef。

单例类

通过利用单例类定义, 就可以给对象添加方法(单例方法)。

str1 = "Ruby"
str2 = "Ruby"
class << str1
  def hello
    "Hello, #{self}!"
  end
end
p str1.hello  #=> "Hello, Ruby!"
p str2.hello #=>错误(NoMethodError)

到目前为止,我们已经多次只在特定的某个类中添加类方法。Ruby 中所有的类都是 Class 类的对象,因此,Class 类的实例方法以及类对象中所添加的单例方法都是类方法。

上一篇下一篇

猜你喜欢

热点阅读