1.
使用send方法
第一种实现动态方法调用是使用send方法,send方法在Object类中定义,方法的第一个参数是一个符号用来表示所要调用的方法,后面则是所调用方法需要的参数。
“This
is
a
dog1″.send(:length)
=>
14
上面的代码中通过send方法去对一个字符串执行length操作,返回字符串的长度。
class
TestClass
def
hello(*args)
”Hello
”
+
args.join(‘
‘)
end
end
a
=
TestClass.new
puts
a.send
:hello,
“This”,
“is”,
“a”,
“dog!”
执行结果为:
Hello
This
is
a
dog!
2.
使用Method类和UnboundMethod类
另一种实现动态方法调用是使用Object类的method方法,这个方法返回一个Method类的对象。我们可以使用call方法来执行方法调用。
test1
=
“This
is
a
dog1″.method(:length)
test1.call
=>
14
class
Test
def
initialize(var)
@var
=
var
end
def
hello()
”Hello,
@var
=
#{@var}”
end
end
k
=
Test.new(10)
m
=
k.method(:hello)
m.call
#=>
“Hello,
@iv
=
99″
l
=
Test.new(‘Grant’)
m
=
l.method(“hello”)
m.call
#=>
“Hello,
@iv
=
Fred”
可以在使用对象的任何地方使用method对象,当调用call方法时,参数所指明的方法会被执行,这种行为有些像C语言中的函数指针。你也可以把method对象作为一个迭代器使用。
def
square(a)
a*a
end
mObj
=
method(:square)
[1,
2,
3,
4].collect(&mObj)
=>
[1
4
9
16]
Method对象都是和某一特定对象绑定的,也就是说你需要通过某一对象使用Method对象。你也可以通过UnboundMethod类创建对象,然后再把它绑定到某个具体的对象中。如果UnboundMethod对象调用时尚未绑定,则会引发异常。
class
Double
def
get_value
2
*
@side
end
def
initialize(side)
@side
=
side
end
end
a
=
Double.instance_method(:get_value)
#返回一个UnboundMethod对象
s
=
Double.new(50)
b
=
a.bind(s)
puts
b.call
执行结果为:
100
看下面一个更具体的例子:
class
CommandInterpreter
def
do_2()
“This
is
2
”
end
def
do_1()
“This
is
1
”
end
def
do_4()
“This
is
4
”
end
def
do_3()
“This
is
3
”
end
Dispatcher
=
{
?2
=>
instance_method(:do_2),
?1
=>
instance_method(:do_1),
?4
=>
instance_method(:do_4),
?3
=>
instance_method(:do_3)
}
def
interpret(string)
string.each_byte
{|i|
Dispatcher[i].bind(self).call
}
end
end
interpreter
=
CommandInterpreter.new
interpreter.interpret(’1234′)
执行结果为:
This
is
1
This
is
2
This
is
3
This
is
4
3.
使用eval方法
我们还可以使用eval方法实现方法动态调用。eval方法在Kernel模块中定义,有多种变体如class_eval,module_eval,instance_eval等。Eval方法将分析其后的字符串参数并把这个字符串参数作为Ruby代码执行。
str
=
“Hello”
eval
“str
+
‘
World!’”
=>
Hello
World!
sentence
=
%q{“This
is
a
test!”.length}
eval
sentence
=>
15
当我们在使用eval方法时,我们可以通过eval方法的第二个参数指明eval所运行代码的上下文环境,这个参数可以是Binding类对象或Proc类对象。Binding类封装了代码在某一环境运行的上下文,可以供以后使用。
class
BindingTest
def
initialize(n)
@value
=
n
end
def
getBinding
return
binding()
#使用Kernel#binding方法返回一个Binding对象
end
end
obj1
=
BindingTest.new(10)
binding1
=
obj1.getBinding
obj2
=
BindingTest.new(“Binding
Test”)
binding2
=
obj2.getBinding
puts
eval(“@value”,
binding1)
#=>
10
puts
eval(“@value”,
binding2)
#=>
Binding
Test
puts
eval(“@value”)
#=>
nil
可以看到上述代码中,@value在binding1所指明的上下文环境中值为10,在binding2所指明的上下文环境中值为Binding
Test。当eval方法不提供binding参数时,在当前上下文环境中@value并未定义,值为nil。
一个最基本的字符串操作是把一个字符串分割成多个子字符串。如果你有一个字符串,如“foo, bar, baz”而你希望的是这样三个字符串“foo”,“bar”,“baz”。那么字符串类的split方法就可以帮助你。“split”的基本用法Split方法的最基本用法分裂一个由单独字符或字符的静态序列组成的字符串。如果split的第一个变量是一个字符串,那么这个字符串中字符就会被当作一个字符串分隔符使用。但是在逗号分隔的数据中,逗号用来分隔数据,这里的每个字符串成分都被用来分隔数据。#!/usr/bin/env rubystr = "foo,bar,baz"puts str.split(",")$ ./1.rbfoobarbaz通过正则表达式来增加灵活性当然,还有一些更容易的方法可以分隔字符串。正则表达式可以为split方法增加灵活性。这里再次拿“foo, bar, baz”。间隔在第一个逗号之后而不是第二个逗号。如果该字符串“,”被当成是分隔符,那么在“baz”字符串的开始处仍然会存在间隔。如果使用“,”字符串,它只与第一个逗号匹配,因为第二个逗号后面没有间隔。其作用还是有限的。解决这个问题的办法是把正则表达式作为定界符的自变量,而不是使用字符串。正则表达式不仅可以匹配静态序列的字符,对字符的不定量和可选字符都同样起作用。编写正则表达式为你的分隔符编写一个正则表达式,第一步就是描述清楚什么是分隔符。在这种情况下,一个逗号后面可能存在一个或多个空格是合理的。这一正则表达式库中存在两个要素:逗号和可选的间隔。间隔会使用* (星号)量词,它表示的意思是“零或更多”。任何在它之前的要素都会匹配零次或若干次。例如,正则表达式/ a * /将匹配序列零或更多“a”字符。#!/usr/bin/env rubystr = "foo, bar,baz"ASPASP(Active Server Pages)动态网页,是微软公司推出的一种用以取代CGI(Common Gateway Interface)通用网关接口的技术。我们可以通过ASP结合HTML语言、ASP指令和ActiveX元件以及数据库等方面知识,使用自己的 Web 服务器创建并运行动态的交互式 Web 站点。ASP的主要优点大概可以归纳如下:
1、您可以用 VBScript 或JScript创建脚本,同时结合HTML语言就能够非常方便地完成网站的应用程序。对于 VBScript和JScript,使用哪种语言并不重要,Web 服务器等同地处理这两种语言,并向用户的浏览器发送 HTML 格式化结果。
2、因为ASP采用Script语言(VBScript和JScript)就可以轻松编写程序,因此这就大节省了网络设计人员又得重新学习一种新语言的时间。而且编写ASP无须手工compile编译或链接程序,可在服务器端直接执行,这无疑是更加方便了我们的编写过程。
3、使用普通的使用记事本之类的文本编辑器,即可进行编辑设计,如:Windows的记事本。建议不要用FontPage98或DreamWeaver2.0等主页制作软件修改,因为他们会破坏源代码的。在这里我建议使用CuteFTP携带的CuteHTML编辑器进行编辑设计。
4、ASP是运行在服务器端,所以我们无须担心浏览器是否支持ASP所使用的编程语言,用户端只要使用可执行HTML码的浏览器,即可浏览Active Server Pages所设计的网页内容。ASP在服务器端运行,当程序执行完毕后,服务器仅将执行的结果返回给客户浏览器,这样也就减轻了客户端浏览器的负担,大大提高了交互的速度。
5、ASP能与任何ActiveX scripting语言相容。除了可用VBScript或JScript语言来设计外,还通过plug-in的方式,使用由第三方所提供的其他脚本语言,譬如Perl、Tcl等。脚本引擎是处理脚本程序的COM(Component Object Model)组件。
6、Active Server Pages的程序代码隐藏,在客户端上仅可以看到由ASP输出的动态HTML文件。因而可以避免所写的源程序被他人剽窃,也提高了程序的安全性。
7、可使用服务器端的脚本来产生客户端的脚本。
8、面向对象(Object oriented),并可扩展ActiveX Server组件功能。
9、ActiveX Server Components(ActiveX服务器组件)具有无限可扩充性。你可以使用任何编程语言来编写你所需要的ActiveX Server 组件。
10、可以通过ADO(ActiveX Data Objects,微软的一种新的数据访问模型,是一种可以提供WEB页面开发者轻松存取Internet的数据库,并可以在用户端实现网上立即、即时更新显示的最新WEB页面数据库技术。)非常方便地访问数据库,从而使存取数据库变得轻松容易。
JSP
JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准,本文简单介绍JSP及其优点。
JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。 JSP技术是用JAVA语言作为脚本语言的,JSP网页为整个服务器端的JAVA库单元提供了一个接口来服务于HTTP的应用程序。
在传统的网页HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp)。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。程序片段可以操作数据库、重新定向网页以及发送 email 等等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,对客户浏览器的要求最低,可以实现无Plugin,无ActiveX,无Java Applet,甚至无Frame。
JSP的优点:
·对于用户界面的更新,其实就是由 Web Server进行的,所以给人的感觉更新很快。
·所有的应用都是基于服务器的,所以它们可以时刻保持最新版本。
·客户端的接口不是很繁琐,对于各种应用易于部署、维护和修改。
Python
首先就以语法而论,python完全没有perl的灵活紧凑。只能说是中庸,感觉和basic,pascal,java差不多。一个简单的问题,如果没有相应的类库,也要写上一段臃肿的代码。唯一的好处是代码臃肿却直白,容易看懂--和basic一样。
类库-比perl真的是大大不如,只能覆盖很小的范围,更不用说java了,很多需要的工作都要自己来做。
快速开发--说实话,我觉得用python和用C++效率差不多。谁能告诉我python效率比C++高在哪里吗?对于perl我则可以毫不犹豫的说,是它语法的灵活,对于字符处理能力的强大。
很多人说python适合大型工程,但更多的人说,他们用python不过是作为一种原型语言来使用。。这本身不就有点矛盾吗?呵呵 而且对于脚本来完成大型工程,我本身就持怀疑态度。
觉得python唯一的优点在于嵌入C++使用时体现出来的:支持OO,语法容易看懂,有一个boost.python
不是想引起论战,只是不吐不快
Ruby
Ruby是面向对象的编程语言,她追求的是“简便快捷的面向对象编程”。Ruby是解释型语言,因此不需编译即可快捷地编程。同时Ruby具有类似Perl的强大的文本处理功能,她可并不只是个玩具,您可以用她来进行实用的编程。此外,您还可以很方便地使用C语言来扩展Ruby的功能,因此可以把她当作各种库的前端来使用。
若您曾经“想要一种简单的面向对象的语言”,或者认为“Perl的功能虽然好用,但它的语法真让人受不了”,又或者觉得“lisp系列语言的思想不错,但到处都是括号真让人讨厌,最起码算式应该按照通常的样式书写”。那么,Ruby或许能让您满意。
归纳以来,Ruby有以下优点。
解释器
Ruby是解释型语言,其程序无需编译即可轻松执行。
变量无类型
Ruby的变量没有类型,因此不必为静态的类型匹配而烦恼。相应地,错误检查功能也变弱了。
不需要变量声明
所有变量均无需声明即可立即使用。另外,从变量名即可判断出是何种变量(局部变量,全局变量,实例变量)。
语法简单
语法比较简单,类似Algol系语法。
不需要内存管理
具有垃圾回收(Garbage Collect,GC)功能,能自动回收不再使用的对象。
一切都是对象
Ruby从一开始就被设计成纯粹的面向对象语言,因此以整数等基本数据类型为首的所有东西都是对象,它们都有发送信息的统一接口。
类,继承,方法
Ruby当然具有面向对象语言的基本功能。
特殊方法
可向某对象添加方法。例如,可以把GUI按钮被按下时的动作作为方法记述下来,还可以用它来进行原型库(prototypebase)的面向对象编程(有人这么干吧)。
用模块进行混合插入(Mixin)
Ruby故意舍弃了多重继承,但拥有混合插入功能。使用模块来超越类的界限来共享数据和方法等。
迭代器
该功能可以将循环抽象化。
闭包
可以将某过程片段对象化。对象化后的该过程片段就称作闭包。
功能强大的字符串操作/正则表达式
以Perl为样板创造出了功能强大的字符串操作和正则表达式检索功能。
拥有超长整数
添加超长整数功能后,可以计算非常大的整数。例如计算400的阶乘也轻而易举。
具有错误处理功能
错误处理功能可以使您编写代码处理出错情况。
可以直接访问OS
Ruby可以使用(UNIX的)绝大部分的系统调用。单独使用Ruby也可以进行系统编程。
动态加载
若OS支持的话,可以在运行时读入对象文件。
但Ruby也有下列缺点。
Ruby On Rails,优点是不像Struts那样需要大量的配置文件,一切都采取默认的配置,包括访问路径,uri等,而这也是它的缺点,不能灵活的配置。
见笑,小弟看了几天,一点见解。
RERL
第一. Perl强大的正则表示式(regular expression)比对以及字符串操作使这个工作变得简单而没有其它语言能相比。Perl 非常擅长于切割,扭转,绞,弄平,总结,以及其它的操作文字文件。生物资料大部分是文字文件:物种名称,种属关系,基因或序列的注解,评住,目录查阅, 甚至DNA序列也是类文字的。现在互相交换以以文字文件的形式存在的但是具有不兼容的资料格式生物信息资料是一个很头疼的问题,perl的这个方面的优点,可以在这一方面解决不少问题.
第二. Perl 能容错。生物资料通常是不完全的,错误或者说误差从数据的产生时候可能就产生了.另外生物数据的某项值栏位可以被忽略 ,可能是空着的,或是某个栏位也就是某个值,被预期要出现好几次(举例来说,一个实验可能被重复的操作),或是资料以手动输入所以有错误。Perl并不介意某个值是空的或是有奇怪的字符。正规表示式能够被写成取出并且更正错误的一般错误。当然这种弹性也可能是各坏处。
还有,Perl 是组件导向的。Perl 鼓励人们将他们的软件写成小模组,不论是用 Perl 函式库模组或是正统的 Unix 工具导向的方式。外部程序能够轻易的被整合进 Perl 程序,靠着管道(pipe),系统呼叫,或是插座(socket)。Perl5 引进的动态载入器允许人们使用 C 的函式,或者让整个编程过的函式库,被使用在 Perl 直译器中。最近的成果是世界各地的智能结晶都会收录在一组模组里面,称为”bioPerl”(请参考 Perl Journal)
Perl 很容易去写并且能很快开发完。直译器让你不需要宣告你所有的函数型式以及资料型态,当未定义的函式被呼叫时只会引起一个错误,除错器也能与Emacs很好的合作并且让你能用令人舒服的交谈式的开发模式。
Perl 是良好的原型语言。因为它快而且脏(quick and dirty),用 Perl 建构新演算的原型比直接写成一个快的需要编程过的语言来的有意义。有时候发现结果是Perl已经够快了,所以程序变不需要移植更多情形是某人可以用C写一个小的核心程序,编程成动态载入的模组或是外部的可执行程序,然后其它的部分用Perl来完成。这部分的例子可以参考 http://waldo.wi.mit.edu/ftp/distribution/software/rhmapper/)。
有一点要强调的是, Perl 在写作网页 CGI 方面非常优秀,而且重要性随着各实验将资料发表在网络上之后更是增加。我在基因中心环境下使用 Perl 的经验从头到尾都是值得称赞的。然而我发现 Perl 也有它的问题。它的松散的程序风格导致许多错误,这些在其它严格的语言都会被抓到。举例来说,Perl 让你在一个变数在被指定值之前就能使用,这是个很有用的特性当你需要的时候,但是却是一个灾难当你单纯的打错了辨识名称。同样的,很容易忘记要宣告一个函式里面的区域变数,导致不小心地改到了全域变数。
最后,Perl 的不足之处在于建立图形化的使用者接口。虽然 Unix忠实信徒所有事情都能在命令模式下完成,大多数的终端使用者却不同意。视窗,选单,弹跳的图案已经变成了必要的时尚。
直到最近,直到最近,Perl 的使用者界面(GUI)发展仍是不成熟的。然而 Nick Ing-Simmons的努力使得 perlTK(pTK) 的整合使得以 Perl 驱动的使用者接口在 X-window上面成为可能。我的伙伴和我曾经在 MIT 基因中心写过几个 pTK 为基础的应用程序供互连网使用者,而且从头到尾都是一个令人满意的经验。其它的基因中心则更大规模的使用 pTK,在某些地方已经成为主要的生产力。