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

动态语言之所以“动态”,最明显的特征就是:类实例的行为/属性可以在new出后,动态修改!个人觉得这种处理相对java/c#(静态语言)来说,更符合现实世界。

比如:一个人刚出生时,除了哭、吃奶等这些基本原始本能,其它的几乎全都不会(原始本能可理解类定义中最开始定义的属性和方法),但随着时间推移,学会了看书,走路,说话...(相当于新增了方法/属性),再往后的人生谁也无法预料,一切都是未知的,所以不太可能象静态语言那样,在运行前就事先把所有的属性/方法全写齐,甚至一个人后来失忆,把原先学会的东西给忘记了也没准(比如突然不会说话了,相当于把实例的方法/属性给动态删除),后来医治好以后,又能说话了(重新添加某种方法)。

当然我的意思也并非静态语言不好,只能说各有各的特点,最后来一段代码吧:

class Person
	def cry
		puts "哇..."
	end

	def eat
		puts "吃奶中,请勿打扰..."
	end

	def showbody
		puts "裸奔一下,展示自己的身体" #这个方法写得比较龌龊 ;)
	end
end

aPerson = Person.new #创造了一个新生儿
aPerson.cry #刚出生,当然要哭几下
aPerson.eat #哭累了,就吃
aPerson.showbody #小孩子嘛,随便给看一下小JJ无所谓啦

class Person
	def read
		puts "学会了看书"
	end

	def walk
		puts "学会了走路"
	end
end

aPerson.walk
aPerson.read

class Person
	undef read #后来因为某种原因,突然不会读书了,也许得了什么怪病吧:)
end

#aPerson.read #这里将报错"undefined method `read' for #<Person:0x39162f0> (NoMethodError)"

class Person
	private:showbody #长大了以后,当然就不能随便给陌生人看自己的身体了 :)
end

#aPerson.showbody #将报错:private method `showbody' called for #<Person:0x35d5f70> (NoMethodError)
时间: 2024-12-22 18:52:22

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

Web Service学习笔记:动态调用WebService

原文:Web Service学习笔记:动态调用WebService 多数时候我们通过 "添加 Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务.在 .NET Framework 的 System.Web.Services.Description 命名空间中有我们需要的东西. 具体步骤: 1. 从目标 URL 下载 WSDL 数据. 2. 使用 ServiceDescription 创建和格式化 WSDL

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 可以

关于动态修改类属性的问题

问题描述 最近遇到一个关于动态修改类属性可见性的问题定义形状.半径.长度.宽度四个属性,其中形状枚举圆形和矩形两种,选择圆形时显示半径属性不显示长宽,选择矩形时显示长宽不显示半径属性.在网上查到了下面的代码,可以实现这个操作:///<summary>设置属性的可见性</summary>/// <param name="obj">属性所属的类</param>/// <param name="propertyName"

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

Python实现动态添加类的属性或成员函数的解决方法_python

某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或成员函数的解决方法,具体方法如下: 首先我们可以参考ulipad的实现:mixin. 这里做的比较简单,只是声明一个类,类初始化的时候读取配置文件,根据配置列表加载特定目录下的模块下的函数,函数和模块同名,将此函数动态加载为类的成员函数. 代码如下所示: class WinBAS(Bas): def

Ruby简洁学习笔记(二):类继承、属性、类变量_ruby专题

1.如何声明一个子类 复制代码 代码如下: class Treasure < Thing 这样Thing类中的属性name,description都被Treasure继承 2.以下三种方式传入父类initialize方法的参数分别是什么? 复制代码 代码如下: # This passes a, b, c to the superclass def initialize( a, b, c, d, e, f ) super( a, b, c ) end # This passes a, b, c t

修改自定义类中属性的可见性问题(动态增减类的属性个数)

问题描述 之前发了一个帖子问题描述的太简单了给大家造成了误解这里重新开贴详细说明出于项目要求需要定义一个属性可以动态增加的类(比如说定义一个截面类,包含形状.半径.长度.宽度四个属性,其中形状枚举圆形和矩形两种,选择圆形时显示半径属性不显示长宽属性,选择矩形时显示长宽属性不显示半径属性.也就是说利用PropertyGrid控件展示该类的属性是,当选择圆形时PropertyGrid可以显示2个属性,选择矩形时PropertyGrid则显示3个属性,无论2个属性还是3个属性对应的是同一个实例)于是在

Ruby学习笔记

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

Ruby学习笔记-Module

Module: 模块的定义和类比较相似,使用module关键字.但模块不能被实例化,也不能被子类化,模块是独立的,且一个模块对像是Module类的一个实例.模块最常用的两个用途是作为命空间和混入(mixin).       在模块中,可以定义实例变量.实例方法.类变量.类方法和属性等,并且在模块中还可能以定义类和模块.在类中也可以定义模块.       在访问模块中的实例成员,需要在类中饱含模块,然后实例化类以访问模块的实例成员.               module FirstModule