易截截图软件、单文件、免安装、纯绿色、仅160KB

Ruby 101:方法对象


Ruby 101:方法对象
Written by Allen Lee
从方法调用说起
      在上一篇文章里,我们看到调用对象的方法实质上是向对象发送消息,下面,我们再来看一个有趣的应用。在Ruby里,字典可以通过 {key => value} 来创建,如果你使用的版本是1.9或以上,当key的类型是Symbol时,创建字典的语法可以进一步简化为 {key: value} (注意,冒号要紧贴在key后面),这使得我们可以创建这样的对象:

代码 1
有没有觉得这个写法很面熟?有些同学可能已经看出来了,这个写法很像JSON,事实上,这个代码正是仿照Wikipedia上的JSON示例代码写出来的,然而,由于它本身是一个字典对象,在访问里面的内容时需要使用字典的语法:

代码 2
现在,请思考一下,有没有办法使它接受这样的做法呢:

代码 3
有些同学可能已经反应过来了——打开Hash类,重写method_missing方法:

代码 4
当我们调用first_name和phone_numbers等不存在的方法时,就会触发method_missing方法,它首先检查字典是否包含这个方法名,若是,返回对应的值,否则,转交super处理。下面,我们执行一下代码:

图 1
很好,基本上达到我们的预期了,但是,这种做法至少存在两个弊病,第一,它强制所有字典使用这种重定向逻辑,第二,如果字典的现有方法和它的键出现重名,重定向逻辑将被忽略,因为现有方法将被优先调用,不会触发method_missing方法,那么,怎么解决这两个问题?嗯……很抱歉,这些问题不是今天的主角,还是待到它们的主戏上演之时再行分解吧……
      现在,请思考一个问题,当我们调用一个方法时,我们只需"直呼其名",像代码3的first_name和city等方法那样(当然,加上"()"也是可以的,即person1.first_name()),这意味着,当我们引用一个方法的名字时,我们实际上在引用它的返回值,那么,如果我想把一个方法本身而不是它的返回值作为参数传给另一个方法呢?考虑这样一个情景,我有一个购物车,内有图书若干:

代码 5
图书通过calc_preferential_price方法计算优惠价格:

代码 6
现在,我想创建一个check_out方法,用来计算货款:

代码 7
那么,我该如何把calc_preferential_price方法传给check_out方法?
      直接把方法的名字传给它肯定不行,因为"直呼其名"意味着调用它,得到的是它的返回值


相关文档:

Ruby on Rails

 Wiki:http://zh.wikipedia.org/zh-cn/Ruby_on_Rails
Ruby on Rails,也简称 RoR 或 Rails,是一个使用Ruby语言写的开源网络应用 框架,它是严格按照MVC结构开发的。它努力使自身保持简单,来使实际的应用开发时的代码更少,使用最少的配置。
Rails的设计原则包括“不要重复自己”(Don't Repeat Yourself ......

ruby调用DLL

 开源测试工具watir是采用的ruby语言进行开发的。在研究watir框架的时候,发现有一部分函数watir没有提供而且暂时没找到合适的gem包,而很多功能在我们原来的自动化测试框架中都通过c写的dll进行了实现,于是我们希望能够把这部分的dll无缝的移植到watir上,减少我们的工作量,而且可以更高效的实现我们需要的功能。
......

Ruby 101:对象和方法


Ruby 101:对象和方法
Written by Allen Lee
从静态方法说起
      在上一篇文章末尾,我们提到了受保护的静态方法……受保护的静态方法??Ruby的protected不是用来向相同类型的不同实例开放受限方法的访问的吗(忘记protected的用法了?不要紧,回去上一篇文章复习一下吧。) ......

清楚VSS文件的批处理(Ruby版)

 
def delVss(path)
  if File.directory?(path)
    for f in d = Dir.open(path)
        fpath = File.join(path, f) 
      if(f!="."&&f!="..")      
    ......

ruby File怎么在源文件的基础上添加内容,而不是重写

有些同学提问:我写数据到文件中会把老的数据替换掉。
怎么在源文件的基础上添加内容,而不是重写
【ruby code】
  def txt_write(value,memo)
      File.open("c:\\my_text.txt", 'a') do |f|  
        ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号