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

时间: 2024-09-13 10:34:04

ruby学习笔记(2)--类的基本使用的相关文章

ruby学习笔记(11)--symbol与hash参数

symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001".object_id puts "0001".object_id puts "0001".object_id puts "0001".object_id 输出结果类似如下: 32088750320887303208871032088690 可以

Ruby学习笔记_索引贴

学习Ruby也有段时间了,在学习的同时也做了些笔记并发到了园子睐.看到园子里的大虾们在出了一系列文章后都会做个索引贴,这样很方便,所以本人今天抽了个空就把它整理了下,方便自己的同时也方便感兴趣的朋友.   Ruby学习笔记目录: 1.Ruby入门 2.Ruby-循环与选择结构 3.Ruby-String 4.Ruby-Array 5.Ruby-Hash 6.Ruby-Block, Proc and Lambda 7.Ruby-正则表达式 8.Ruby-Symbol 9.Ruby-Method,C

Ruby学习笔记

Ruby语言中,以对象为基本单位,可以说所有的元素都是对象.按照之前对于面向对象程序的理解,对象是指包含了特定属性和方法集合的一组程序.对象由类来定义,具体的表现为对象实例.也就是说,对象是类的实例化[2]. Ruby语言的基础元素 对象:数值对象.字符串对象.正则表达式对象.时间对象.文件对象.目录对象.数组.哈希.例外对象等 数值对象      由于Ruby中一切数据都是对象,所以我们处理的数字实际上也是对象.      a = 10,这样一个简单的赋值语句,实际上应当理解为 a = Num

ruby学习笔记(4)-动态修改类的属性

动态语言之所以"动态",最明显的特征就是:类实例的行为/属性可以在new出后,动态修改!个人觉得这种处理相对java/c#(静态语言)来说,更符合现实世界. 比如:一个人刚出生时,除了哭.吃奶等这些基本原始本能,其它的几乎全都不会(原始本能可理解类定义中最开始定义的属性和方法),但随着时间推移,学会了看书,走路,说话...(相当于新增了方法/属性),再往后的人生谁也无法预料,一切都是未知的,所以不太可能象静态语言那样,在运行前就事先把所有的属性/方法全写齐,甚至一个人后来失忆,把原先学

Ruby学习笔记之Ruby 对象

大部分 Ruby 程序,它们的设计,逻辑,动作,都是围绕着对象进行的.写一个 Ruby 程序,主要的工作就是去创建对象,然后给它们能力,让它们可以去执行动作. Ruby 是 OOP 语言,就是面向对象的语言,你执行的计算,数据处理,输入与输出这些动作,都是通过创建对象,然后让这个对象去执行指定的动作来完成的.对象(object)在现实世界里,就是一个东西.一个苹果是一个对象,一张桌子也是一个对象. 每个对象是一个特定的类的实例(instance),对象的行为大部分是在它们所属的那个类上面定义的方

学习笔记-Mixin类和多重继承

笔记|继承 Mixins and Introductions 很多人说道AOP,都以为AOP就是截取器,切入点表达式,方面和实现(advices).其实AOP 不止这些,另外一个很重要的功能在JBOSS AOP里面就是可以透明的给JAVA类传入接口.你 可以强制一个类实现的接口,甚至你可以附加另外的类(mixins)来实现这个接口.就像C++ 里面的多重集成. 引入 首先我们介绍怎么强制现有的类来实现你希望它实现的接口. 首先的例子是让一个非可持久化类实现持久化能力.这对你将是十分有用的代码.

Ruby学习笔记一 安装Ruby与Ruby的爬虫应用

最近终于空下来了,所以下个Ruby玩玩,安装Ruby很简单,去官网下载一个一键 安装包既可,linux下的安装,大家Google下就有很多教程了.对于IDE网上说 NetBeans支持得很完美,但是因为本人比较喜欢Eclipse,所以还是跟大家推荐 EasyEclipse for Ruby and Rails,当然你可以选择只下RoR的插件而不弄个全新 的Eclipse. 以前一直在用Java写爬虫工具抓图片,对HttpClient包装,正则表达式处理那 个是累啊,就算弄好了工具类,有时候一会又

ruby学习笔记(1)--初识语法

虽然ruby/ruby on rails从2007年就一直获奖无数,但身为一个中国人,一直对小日本创造的东西不怎么感兴趣,想想其实也没必要,技术本身是无国界的,日本其实也有值得学习的地方(扯远了,呵) 单从技术而言,ruby本身确实很爽,令程序员的工作变得轻松有趣! 下面的代码演示了如何找出100以内的素数: using System; namespace Mersenne { class Program { static void Main(string[] args) { for (int

ruby学习笔记(5)-模块module的运用

ruby中的module与.net中的namespace有点类似,可以用来区分同名但属于不同开发者(或组织)的代码. 下面的代码,定义了一个Me模块,里面的sqrt与Math模块中的sqrt重名,另外还有一个重名常量PI #定义一个模块(有点类似.net中的命名空间) module Me def sqrt(num1,num2=-1) return "num1=#{num1},num2=#{num2}" end PI = 3.14; end puts Math::PI #在未includ