zoukankan      html  css  js  c++  java
  • Ruby学习(三)——类与对象(1)

    今天看了《Ruby元编程》,感觉内容新颖翔实,是Ruby中难得的一见的好书,在此推荐给大家。其实今天看的主要是第一章的第一部分,先把内容梳理一下,也许这一部分会分成几天的内容来给大家介绍吧。

    首先来说明一下,作为一种面向对象语言,Ruby中自然包含两个感念,即“类”与“对象”。一般而言,类是一组方法和一组数据的集合,而对象则可以看作是类的实例化。需要注意的是,在Ruby中“对象是由实例变量和一个类的引用组成”(《Ruby元编程》),这句话是什么意思呢?让我们先来看一个书中的示例,了解一下什么是实例变量,以及它具有的特性

    class MyClass
        def my_method
            @v = 1
        end
    end
    obj = MyClass.new
    obj.instance_variables
    obj.my_method obj.instance_variables

    此时,系统给出的输出是

     => []

    => [:@v]

    从中可见,对象obj的实例变量就是@v,但是相信大家也注意到了,当obj未执行my_method时,obj对象不具备任何实例变量,也即是说,对象obj的实例变量与类MyClass没有任何关联,它只是在执行过程中生成的。而这正是Ruby与其他静态语言的差别之一。

    前文提到了,类是由数据和方法组成的,而对象作为类的实例化,也自然具备方法。探讨了数据之后,我们再来看看Ruby对象的方法。事实上,在Ruby的对象中并没有存储方法,而是将方法存储到了类中,因此对象必须存储其自身的类,在此例中极为MyClass,我们可以通过相关代码来查看:

    obj.class 
    
    # => MyClass

    如果你了解C#或Java,也许你会说,my_method难道是类的静态方法?其实这是一种错误的理解,正确的说法是:my_method是类的实例方法(即必须通过定义类的实例才能使用),是对象obj的方法。而我们头脑中的“静态方法”在Ruby中被称为“类的方法”,是不是这些概念有点绕?没关系,我们再看一个例子(也是《Ruby元编程》中的):

    String.instance_methods = "abc".methods

    上面这个示例的返回结果是true,而

    String.methods = "abc".methods

    的返回结果则是false

    是不是清楚了一些呢?

    【注】另外再说一句,在所有类外定义的函数是全局函数,而这些所谓的全局函数其实是Object类的私有实例方法

     关于这一点,我们不妨做一个小的实验

    首先定义一个函数

    def test_method
        puts "test Object methods"
    end

    此时,在irb中执行以下命令:

    Object.private_methods

    可以看到,test_method已经成为Object的私有函数了。

  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/supakito/p/3672382.html
Copyright © 2011-2022 走看看