Ruby 1.9概要(3)类和模块

三、类和模块
1、Module#instance_methods, #private_instance_methods, #public_instance_methods Module这三个方法都将返回方法名

的symbol组成的数组,而非过去的字符串数组。

2、Module#const_defined?, #const_get 这两个方法都添加一个参数flag,用来决定是否将它的ancestor中的const包括在查
找链中,例如:

module A; X = 1; def foo; end end
module B
  include A
  const_defined? "X"                              # => true
  const_defined? "X",false                        #uninitialized constant
  const_get "X"                                   # => 1
  const_get "X",false                             #uninitialized constant  
end

3、Module#class_variable_defined?方法:

class X; end
X.class_variable_defined? :@@a                    # => false
class X; @@a = 1 end
X.class_variable_defined? :@@a                     # => true

class_variable_{get,set}方法:

class B; self end.class_variable_set(:@@a, "foo")        # => "foo"

4、Module#attr等价于Module#attr_reader:

class Test
  attr:foo
  def initialize
    @foo=3
  end
end
t=Test.new
puts t.foo   #=>3
t.foo=4     #undefined method "foo="

5、接下来是一个bug fix的问题。下面这段代码是为了证明对象的singleton类继承自对象的类:

class X;end; x=X.new; class << x;p self < X; end

在1.8上,这段代码打印nil,这是不符合Ruby的对象模型的,因此在1.9运行已经可以打印正确结果true了。
如果不理解这点,参照俺过去写的《Ruby对象模型》

6、新增Module#module_exec方法,与Object#instance_exec类似

7、绑定未绑定的方法时进行额外的子类型检查,例如下面的代码:

class Foo; def foo; end end
module Bar
   define_method(:foo, Foo.instance_method(:foo))
end
a=""
a.extend Bar
a.foo

在1.8上,这段代码只有当执行到a.foo的时候才报错:"foo":bind arguments must be an instance of Foo(TypeError)
因为foo是Foo的instance method,因此调用者必须是Foo或者其子类的instance。 而在1.9中,在绑定还没有绑定的方法的时候引入了额
外的检查,因此上面这段代码不必等到a.foo调用就将报错:

class Foo; def foo; end end
module Bar
   define_method(:foo, Foo.instance_method(:foo))   #=》 in "defined_method":bind arguments  must be a subclass

of Foo<TypeError>
end

8、binding#eval方法,新增加的:

a=1
binding.eval("p a")  => 1

这个貌似与1.8中的:

a=1
eval("a",binding)

文章转自庄周梦蝶  ,原文发布时间2008-10-01

时间: 2024-09-17 04:02:58

Ruby 1.9概要(3)类和模块的相关文章

在Ruby中利用Net::SMTP类发送电子邮件的教程

  这篇文章主要介绍了在Ruby中利用Net::SMTP类发送电子邮件的教程,包括类中所带方法的用法介绍,需要的朋友可以参考下 简单邮件传输协议(SMTP)发送电子邮件及路由的e-mail邮件服务器之间的协议处理. Ruby 提供 Net::SMTP 类的简单邮件传输协议(SMTP)客户端的连接,并提供了两个新的方法:new 和 start. new 带两个参数: server name 默认为 localhost port number 默认为熟知的 25 start 方法带有以下这些参数:

ruby中有没有获取指定类中所有方法名的方法?

问题描述 请问ruby中有没有获取指定类中所有方法名的方法?类似,php中 get_class_methods的方法我想去遍历执行一个指定类中的所有方法...  问题补充:例<br />class Test<br />  def a<br />  end<br /><br />  def b<br />  end<br /><br />  def c<br />  end<br />en

VB.net类和模块的概念提问

问题描述 请问规范的程序什么情况需要类和模块,类和模块里面包含了些什么代码?新手,希望达人能告诉我. 解决方案 解决方案二:兄弟看资料吧,一搜一大堆.如果时间精力不够,可以先不用,从基本的代码写起,等熟悉了,再学吧.解决方案三:使用模块一般仅仅是出于代码重用的目的,比如说有一个验证日期格式的函数,可以写到模块里直接调用,我觉得模块类似于静态类使用类的情况包括:有继承.重载的需要:需要触发事件等考虑到扩展性,一般都使用类解决方案四:模块和类的概念是编程的基础知识,这些概念是不份语言的.不同的语言,

Ruby 组织对象用的类的用法介绍

类与实例 2016年9月5日 下午7:35 *** 一个类里面会定义一些方法,类存在的理由就是要被实例化,也就是去创建一个类的实例得到一个对象.一个实例化的动作,像这样: obj = Object.new Object 是 Ruby 内置的一个类,在类上使用点形式,就是 Object 与 new 之间的那个点.你就是发送了一个信息给类.类会对这个信息做出响应,就像对象可以响应信息一样.类也是对象.new 方法是一个构造器,也就是类里面的可以加工与返回新实例的方法. 使用 class 关键词可以去

Semantic-UI的React实现(二):CSS类构造模块

更简单的类名标签 Semantic-UI使用了更简单的类名声明.用过Bootstrap的同学都会被其复杂的类名标签折磨过,例如一个简单的按键样式,不论颜色或是大小,都需要btn-前缀声明: <button type="button" class="btn btn-primary btn-lg active">Primary button</button>  在Semantic-UI中,类名更接近自然表述: <button class=&

在Ruby中利用Net::SMTP类发送电子邮件的教程_ruby专题

简单邮件传输协议(SMTP)发送电子邮件及路由的e-mail邮件服务器之间的协议处理. Ruby 提供 Net::SMTP 类的简单邮件传输协议(SMTP)客户端的连接,并提供了两个新的方法:new 和 start.     new 带两个参数:         server name 默认为 localhost         port number  默认为熟知的 25     start 方法带有以下这些参数:         server - IP SMTP服务器名称,默认为localh

ruby中的类变量与类实例变量

首先,在ruby1.8中类变量是所有子类和父类共享的,可以看下面的代码: class IntelligentLife @@home_planet = nil def self.home_planet @@home_planet end def self.home_planet=(x) @@home_planet = x end #... end class Terran < IntelligentLife @@home_planet = "Earth" end class Mar

Ruby 1.9概要(1)新的语法和语义

一.新的语法和语义 1.新的Hash定义语法: 例如{a:2}  等价于 {:a=>2} 但是 {"a":2} 出错,并不等价于 {:"a"=>2} 2.试验性质的block内的局部变量 在1.8,block的与外部同名的变量是同一个变量,也就是说block内的变量也可以修改外部的同名变量,这很容易形成难以查找的bug. 例子: # {常规参数;局部变量}d = 2 a = lambda{|;d| d = 1} a.call() d        # =

Ruby 1.9概要(2)Kernel和Object

二.Kernel 和 Object 1.引入了BasicObject对象,作为一个顶级的空白状态对象: BasicObject.instance_methods # => [:==,:equal?,:"!",:"!=",:__send__]Object.ancestors       # => [Object, Kernel, BasicObject] 引入这个对象对于Ruby对象体系带来的影响我还不清楚. 2.instance_exec方法,允许传递参