zoukankan      html  css  js  c++  java
  • ruby学习笔记(2)类的基本使用

    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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Spring.profile配合Jenkins发布War包,实现开发、测试和生产环境的按需切换
    Ubuntu 配置 Tomcat
    Proper usage of Java -D command-line parameters
    Linux下设置MySql自动启动
    cent6.x配置主机名及静态网络
    vmware can not be closed virtual machine is busy
    VMware虚拟机下扩容磁盘(centos7)
    Spring、MyBatis、Shiro、Quartz、Activiti框架
    Jenkins ChangeLog
    JEECG DataGridColumn dictionary使用问题
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1667326.html
Copyright © 2011-2022 走看看