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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏抠抠空间

python内置函数大全

 数学运算 abs:求数值的绝对值 >>> abs(-2) 2 divmod:返回两个数值的商和余数 >>> divmod(5,2) (2, 1) >> d...

29460
来自专栏java一日一条

如何用 JavaScript 实现一个数组惰性求值库

看到函数式语言里面的惰性求值,想自己用 JavaScript 写一个最简实现,加深对惰性求值了解。用了两种方法,都不到 80 行实现了基本的数组的惰性求值。

9820
来自专栏Python疯子

python列表,字典排序使用小知识点

14670
来自专栏水击三千

JavaScript函数(二)

在前面我们已经对函数作了简单的介绍,比如函数的定义、函数的声明、函数的调用和函数的传参等。本节将进一步介绍函数的应用,深度理解函数的各种使用。 函数是一个对象,...

29070
来自专栏程序员互动联盟

【Java概念学习】--数组的初始化

一维数组的声明方式: type var[]; 或type[] var; 声明数组时不能指定其长度(数组中元素的个数), Java中使用关键字new创建数组对象,...

344110
来自专栏liukaili_666888999

Swift变量 常量

11320
来自专栏me的随笔

Python中的类、对象、继承

上述访问级别更多的是一种编程约定,即便是以双下划线开头的字段,在类的外部也是可以访问的,但不建议这么做。示例代码如下:

18050
来自专栏前端知识分享

js数组常用方法总结

最近工作中经常用到数组操作,每次都傻傻不知道怎么用,今天有时间整理了一下,希望对大家有帮助!这些基础的知识,要熟记于心。

1K30
来自专栏小樱的经验随笔

【Java学习笔记之五】java数组详解

数组 概念 同一种类型数据的集合。其实数组就是一个容器。 数组的好处 可以自动给数组中的元素从0开始编号,方便操作这些元素...

29480
来自专栏互联网开发者交流社区

Java关键字final、static使用总结

15230

扫码关注云+社区

领取腾讯云代金券