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方法?
直接把方法的名字传给它肯定不行,因为"直呼其名"意味着调用它,得到的是它的返回值
相关文档:
http://www.erikveen.dds.nl/distributingrubyapplications/rails.html:
In this tutorial, we'll go through the following steps: Setup the environment Create the SQLite database Develop the Rails application Create the RBA (= Ruby archive) from the application with Tar2RubyScript ......
1:FXRuby is a library for developing powerful and sophisticated cross-platform graphical user interfaces (GUIs) for your Ruby applications. It’s based on the FOX Toolkit, a popular open source C++ library developed by Jeroen van der Zijp. What that means for you as an application developer is that ......
Ruby 101:对象和方法
Written by Allen Lee
从静态方法说起
在上一篇文章末尾,我们提到了受保护的静态方法……受保护的静态方法??Ruby的protected不是用来向相同类型的不同实例开放受限方法的访问的吗(忘记protected的用法了?不要紧,回去上一篇文章复习一下吧。) ......
1、文件的打开与关闭
``r'' Read-only, starts at beginning of file (default mode).
``r+'' Read-write, starts at beginning of file.
``w'' Write-only, truncates existing file to zero length or creates a new file for writing. ......
一 安装ruby
$sudo apt-get install ruby irb rdoc
二 安装gem
1.到这里下载 ,最好是最新版本,我的1.3.5
解压,切换到当前目录,执行$sudo ruby setup.rb
或者这样:
$ tar xzvf rubygems-1.3.5.tgz (解压)
$ cd rubygems-1.3.5 (切换到此目录)
$ sudo ruby setup ......