www.appflying.com,iPhone and iPad, top Apps, drop price.
‘Advanced Rails’ 分类下的文章
24

1.2.5 代码块,方法和过程

2008年十月24日,星期五,下午 3:03 | 分类:Advanced Rails, default | 给我留言 |

Ruby中的一个强大的特性是有能力将一段代码当作一个对象来处理。这个特性涉及到如下三个类: Proc 一个过程(Proc)代表了一个代码块:一段可以在被调用时接收参数并且有返回值的代码。 UnboundMethod 它类似于一个过程:它代表一个特定类的实例方法(类方法是类对象的实例方法,因此UnboundMethods同样也可以代表类方法)。一个UnboundMethod 能够在其被调用前必须绑定到一个类。 Method Method对象是已经通过UnboundMethod#bind方法绑定到一个对象上的UnboundMethod。它也可以通过Object@method方法来得到。 下面让我们来看看都有哪些途径能够获得Proc和Method对象。我们在例子中使用Fixnum#+方法。我们通常通过二元形式来调用它。 3 + 5 # => 8 然而,它也可以被当作Fixnum对象的一个实例方法来调用,就像任意其它实例方法一样: 3.+(5) # => 8 我们可以使用Object#method方法来获得一个表示这个实例方法的对象。这个方法将被绑定到方法被调用的那个对象上,在上面的例子中就是3。 add_3 = 3.method(:+) add_3 # => #<Method: Fixnum#+> 此方法可被转换为一个块,或者可被直接带参数调用: add_3.to_proc # => #<Proc:0x00024b08@-:6> add_3.call(5) # => 8 # Method#[] is a handy synonym for Method#call. add_3[5] # => 8 有两种途径获得非绑定方法。可以在类对象上调用instance_method: add_unbound = Fixnum.instance_method(:+) add_unbound [...]

(阅读更多精彩内容...)
24

1.2.4 变量查找

2008年十月24日,星期五,下午 2:02 | 分类:Advanced Rails, default | 给我留言 |

在Ruby中有四种类型的变量,它们是全局变量、类变量、实例变量及局部变量。全局变量作用于全局,局部变量只作用于局部,因此下面的讨论均不涉及它们,因为它们不与Ruby的类系统进行交互。 注:还有常量,但是它们不应该被改变。(事实上可以改变,但是Ruby会发出警告。) 实例变量是与特定对象相关的。实例变量以一个@符号开始:@price既是一个实例变量。因为每个Ruby对象都有一个iv_tbl结构,所以任何一个对象都可以有实例变量。由于一个类也是一个对象,所以一个类亦可以拥有实例变量。下面的代码展示了如何访问一个类实例变量的方法: class A @ivar = “Instance variable of A” end A.instance_variable_get(:@ivar) # => “Instance variable of A” 实例变量总是基于self指针指向的对象来解析的。上面的代码,因为self是在class A … end中定义A的类对象,所以@ivar又属于A的类对象。 但是,类变量则不同。任何一个类的实例都可以访问其类变量(就是以@@开头的变量)。类变量也可以被其类定义自身所引用。虽然一个类变量和实例变量相似,但他们不是一回事: class A @var = “Instance variable of A” @@var = “Class variable of A” def A.ivar @var end def A.cvar @@var end end A.ivar # => “Instance variable of A” A.cvar [...]

(阅读更多精彩内容...)
24

1.2.3 Metaid

2008年十月24日,星期五,下午 2:02 | 分类:Advanced Rails, default | 给我留言 |

“why the lucky stiff”为Ruby元编程创建了一个极小的库,叫做metaid.rb。在任何需要元编程的项目中都可以引进这段非常有用的代码: class Object # The hidden singleton lurks behind everyone def metaclass; class < < self; self; end; end def meta_eval &blk; metaclass.instance_eval &blk; end # Adds methods to a metaclass def meta_def name, &blk meta_eval { define_method name, &blk } end # Defines an instance method within a class def class_def [...]

(阅读更多精彩内容...)
24

Method Missing

2008年十月24日,星期五,下午 2:02 | 分类:Advanced Rails, default | 给我留言 |

解决了前几篇所有的疑惑后,理解method_missing就变得非常简单。其准则是:如果整个方法查找过程中,直到到达了Object都以失败而告终,那么将再次执行方法查找,但这次查找的是method_missing方法而不是原来调用的方法。如果method_missing方法被找到,它将被传入原方法的调用参数并调用,原调用的代码块也会被传入method_missing方法。 Object中的缺省method_missing(rb_method_missing)函数将抛出一个异常。

(阅读更多精彩内容...)
  • 信息发布
macbook pro



关于 里克
里克:本名李玮,全职SOHO开发,技术咨询
邮件:hi@liwei.me
QQ:5175486
MSN:liwei78@live.com
05年开办公司,从事企业网站开发及维护,后从事社会化搜索引擎研发,08年底至今从事sns开发。近期专注Rails3,工作笔记整理及iphone开发学习。

狂爱Fm系列游戏。喜欢研究电影。关注IT新闻。写原创剧本和使用the movies拍摄短片,剪辑能力极强。美剧迷。狂热的英超曼城球迷。32岁的东北人。