网站大量收购独家精品文档,联系QQ:2885784924

Ruby语言的动态特性.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Ruby语言的动态特性

一、Ruby的动态特性

Ruby是一门动态解释型语言,动态特性是相对静态语言的,动态性为代码提供了运行时检查和修改程序的能力,能够让程序在运行时不断的调整适应不同的情况,甚至可以说动态性能让程序自己构造并执行代码,也就是元编程。

Ruby的动态特性特现在以下几个方面:

动态执行字符串形式的代码

动态获得模块或者类中的常量和变量值

动态为类或者对象添加方法

对位置变量和方法的动态处理

动态删除定义

二、动态执行字符串形式代码

eval是功能强大的动态执行函数,它能够编译并执行任何包含Ruby代码段的字符串。

在无法控制字符串内容的情况下,eval是非常不安全的,恶意用户可能会利用它执行有害代码,Ruby中还有class_eval、module_eval和instance_eval,它们都具有动态执行字符串形式代码的能力

class_eval是在类的上下文范围中奖字符串作为代码来执行,module_eval是在类或者模块的上下文中执行,instance_eval则是在实例的上下文范围中执行。

classString

deftruncate(n)

self[0,n]+(self.sizen?....:)

end

foriin[5,8,10,20]

module_evaldeftruncate_#{i}

truncate#{i}

end

end

end

putsstark.truncate(2)

putspeter.truncate_20

putsCaptainAmerican.truncate_10

执行上述代码,输出结果如下:

st....peterCaptainAme....

上述代码中为String类定义了一个truncate方法,用来截取指定长度的字符串并加上省略号,这个功能常用在标题的显示或者文章简介中。代码通过module_eval创建了4个实例方法,避免了使用时再次传递参数。

对象的send方法可以用作动态调用对象的方法,send方法的参数为具体的方法名的字符串形式。

putstony.upcase#TONYputstony.send(upcase)#TONY

三、动态获取类或模块中的方法、变量和常量值

方法的获取

Ruby中的对象都具有methods方法,该方法返回的对象包含了所有公开方法的数组。

instance_methods方法则返回所有公开的实例方法名,相应的protected_methods和private_methods则返回被protected和private关键字修饰的方法。

method_defined?用于检查类中是否定义了指定的实例方法,response_to?用于检查类是否能够响应某实例方法的调用。

putsInteger.methods#返回数值对象的所有public修饰的方法putsInteger.instance_methods#返回数值对象的所有public修饰的方法putsString.protected_methods#返回字符串对象的所有protected修饰的方法putsString.method_defined?(:upcase)#true表示String类中定义类upcase方法putsstr.respond_to?(:upcase)#true表示str字符串可以调用upcase实例方法putsstr.respond_to?(:sqrt)#falsesqrt是数字对象调用的方法,str字符串不可以调用,返回false

常量的获取

const_get方法可以根据常量的名称来获取模块或者类中的常量的值,例如获取Math对象中PI常量的值,除了const_get之外还有:

const_defined?:用判断常量是否定义

constants:获取全部常量值等

const_set:用于定义一个常量,并返回常量的值

const_defined?:用判断常量是否定义

constants:获取全部常量值等

const_set:用于定义一个常量,并返回常量的值

putsMath.const_get(PI)

putsMath.const_defined?(:P)#false

putsMath.const_set(P,1000)#1000

putsMath.const_defined?(:P)#true

putsMath.constants

执行上述代码,

您可能关注的文档

文档评论(0)

189****5221 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档