ruby 学习笔记(2) 类的基本使用

所属分类: 脚本专栏 / ruby专题 阅读数: 342
收藏 0 赞 0 分享
ruby语言跟c#的一些重要差别在于:
1.ruby是动态语言,c#是静态语言--即对象在new出来以后,ruby还可以动态给对象实例添加一些属性或方法(javascript也是如此)
2.ruby中刻意弱化了变量类型这个概念,默认情况下变量/方法都不需要声明具体(返回)类型,但其实在ruby内部,会自动根据变量的值分配类型。(可以通过 “puts 变量.class“查看)
3.ruby相对c#来讲,可能有些雷的地方在于:父类中的private成员,居然是可以在子类中使用的!
...其它地方,等学习深入了再写出来
最后上一段测试代码,展示了ruby中类的基本用法:
复制代码 代码如下:

class People #跟javascript这类动态语言一样,ruby中的类也没有public,private这类访问控制标识符

    def initialize(_name) #构造函数,名字是固定:initialize
        @name = _name; #约定:类的私有变量以@开头
    end

    def to_string #类似C#中的做法,这里写一个ToString方法的ruby版
        "My name is #{@name}" #ruby中方法最后一行的值,会被当作函数值返回
    end

    def get_name_size
        return @name.length #这个方法中返回的是数字型(即名称的长度)
    end

    def test #类定义的最后部分,把这个方法标记为私有方法了
        puts "private method(test) in People."
    end

    def show_name
        test #私有方法,可在内部调用
        puts "name = #{@name}"
    end

    attr_accessor:name #定义一个可读写的属性,这里也体现了ruby的一个重要思想:约定重于规范,因为@name在之前已经使用过,这里的属性只需要把@去掉,ruby就会自动智能的生成类似c#中 set{value = @name},get{return @name}的语句

    private:test #标明test方法是private属性的
    protected:get_name_size #标明get_name_size只能在本类或子类定义中使用(或者在子类定义中赋值给子类实例)

end
aPeople = People.new("jimmy");#创建一个People的实例
puts aPeople.to_string #调用to_string方法
#puts aPeople.get_name_size #将报错,因为该方法受保护
#puts aPeople.test #将报错,因为该方法是私有方法
aPeople.show_name
puts aPeople.name
aPeople.name = "杨俊明" #修改姓名
aPeople.show_name
#再定义一个子类
class Man < People    
    def initialize(_name)
        super
        @sex = true
    end    

    attr_reader:sex #定义只读属性sex

    def call_protected_method
        puts get_name_size #调用父类的受保护方法
    end

    def call_protected_method2(man1)
        puts man1.get_name_size #注意这里:这里可以把父类的受保护方法,动态添加到子类实例
    end

    def call_private_method #子类可以调用父类的私有方法!!! 这一点刚开始很不习惯
        test
    end

    def call_private_method2(man1)
        man1.test #注意这里:语法检查虽然可以通过,但是运行时会提示私有方法无法调用,这也是private与protected的区别
    end

    
end
puts "******************************"
aMan = Man.new("jimmy.yang");
aMan.show_name
aMan.call_protected_method
puts aMan.sex
aMan.call_private_method
aMan2 = Man.new("Mike")
aMan.call_protected_method2(aMan2);
#aMan.call_private_method2(aMan2);
a = "abc";
#aMan.call_protected_method2(a); #虽然ruby本身对变量没有类型概念,但是这样却不行,即:在调用父类的受保护方法时,其实是要类型匹配的
puts aMan.class #显示aMan的类名称

运行结果如下:
复制代码 代码如下:

>ruby classDemo.rb
My name is jimmy
private method(test) in People.
name = jimmy
jimmy
private method(test) in People.
name = 杨俊明
******************************
private method(test) in People.
name = jimmy.yang
10
true
private method(test) in People.
4
Man
>Exit code: 0

作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
更多精彩内容其他人还在看

简要解读Ruby面向对象编程中的作用域

作用域在面向对象编程中是一个十分重要的概念,程序构建时必须要理解清楚类和方法以及对象的作用范围,接下来就为大家简要解读Ruby面向对象编程中的作用域
收藏 0 赞 0 分享

详解Ruby中的instance_eval方法及其与class_eval的对比

Ruby的eval族方法将字符串作为代码来执行,instance_eval方法便是其中之一,下面就来详解Ruby中的instance_eval方法及其与class_eval的对比
收藏 0 赞 0 分享

Ruby程序中正则表达式的基本使用教程

和Python与Perl一样,Ruby对正则表达式的支持也是相当好的,这里送出整理的Ruby程序中正则表达式的基本使用教程,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby on Rails所构建的应用程序基本目录结构总结

Ruby on Rails是Ruby世界中一家独大的Web开发框架,要掌握Rails程序的构建,对其目录结构的了解十分必要,下面就来看一下Ruby on Rails所构建的应用程序基本目录结构总结
收藏 0 赞 0 分享

Ruby中的gem包管理的使用及gem源搭建教程

RubyGems是Ruby世界中的包管理工具,gem命令使用起来就如同Linux中的apt与yum一样,也可以构建自己的gem源,下面就带大家一起来学习Ruby中的gem包管理的使用及gem源搭建教程
收藏 0 赞 0 分享

Linux下Redis数据库的安装方法与自动启动脚本分享

这篇文章主要介绍了Linux下Redis数据库的安装方法与自动启动脚本分享,自动启动脚本分别针对CentOS和Ubuntu系统来给出了编写示例,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby与Ruby on Rails框架环境搭建的简明教程

这篇文章主要介绍了Ruby与Ruby on Rails框架环境搭建的简明教程,包括RubyGems的升级与OpenSSL的支持等配置,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby编写HTML脚本替换小程序的实例分享

这篇文章主要介绍了Ruby编写HTML脚本替换小程序的实例分享,单纯使用Ruby中的字符串替换方法而没有涉及更复杂的正则表达式,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Ruby中的代码块对象Proc

在Ruby中一个代码块block不是对象,但可以用Proc来替代其作为对象进行操作,接下来我们就来详解Ruby中的代码块对象Proc
收藏 0 赞 0 分享

Ruby中的Proc类及Proc的类方法Proc.new的使用解析

用Proc类可以用Proc.new来创建一个Proc类,进而来操作块,这里我们就来进行Ruby中的Proc类及Proc的类方法Proc.new的使用解析.
收藏 0 赞 0 分享
查看更多