`
Goldice
  • 浏览: 106971 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Ruby之类定义

阅读更多

介绍几种不常见的类定义方法:

 

1. Struct

 

Person=Struct.new(:name,:age,:sex)

p=Person.new("liyuchun")

puts p      

 

 Struct生成一个仅仅包含数据属性的类。但是你可以在这个类的基础上扩展:

 

Person=Struct.new(:name,:age,:sex)

class Person
        def log
                puts "log here"
        end
end

 

 ok,这样看上去并不是那么的cool,不是嘛。让我们稍微改一下:

 

class Person < Struct.new(:name,:age,:sex)
        def log
                puts "log here"
        end 
end

 

 it seems better. "<" 只要求后面跟着任何返回一个class object的表达式即可。

 

2. Class.new

我们是怎么定义一个类的?

 

class A
end

a = A.new

追根溯源,A是一个Class类的对象,而a是A类的对象。既然A通过new方法可以生成a,那么是否可以Class也可以通过new方法生成A呢?of course.

 

 

A = Class.new do
        def self.log
                puts "log here"
        end 

        def log
                puts "log there"
        end 
end

a=A.new
A.log
a.log

 

By default,新生成的类会继承自Object。But,if I want to change? Still easy : 

  A = Class.new(String) do ... end

此时,A就是继承自String类。

 

3. instance_eval和class_eval

何以解忧?唯有看代码。

 

class MyClass
end

MyClass.class_eval do
        def instance_method
                puts "In an instance method"
        end 
end

obj = MyClass.new
obj.instance_method

 然后

 

class MyClass
end

MyClass.instance_eval do
        def class_method
                puts "In a class method"
        end 
end

MyClass.class_method                        

class_eval生成的是实例方法,instance_eval生成的是类方法,何须多言啊,呵呵。

also,

 

animal = "cat"
"dog".instance_exec(animal) do |other|
          puts "#{other} and #{self}"
end

Ruby 1.9 引进了一些变种. Object#instance_exec, Module#class_exec和Module#module_exec使用instance_exec,你可以将参数传入block。

 

ok,我们可以利用class_eval实现attr_accessor的功能了:

 

module Mod
        def attr_reader1(*syms)  
               syms.each do |sym|  
                  class_eval %{
                            def #{sym}  
                                 @#{sym}  
                            end} 
                 end  
        end  
end  

class A
        extend Mod 
        attr_reader1 :name

        def initialize
                @name = "jinbin"
        end 
end

a=A.new
puts a.name

原来这里用的是include Mod,是不正确的。但是恰巧命名的函数为attr_reader,结果程序竟然也能运行通过,呵呵。ATTENTION!

 

这里使用了class_eval函数,出于对比,也用instance_eval来写了一个:

module Mod  
        def attr_reader(*syms)    
               syms.each do |sym|    
                  instance_eval %{  
                            def #{sym}    
                                @#{sym}
                            end}   
                 end    
        end    
end    
  
class A  
        extend Mod   
        attr_reader :name  

        @name = "jinbin"
  
        def initialize  
        end   
end  
  
puts A.name
由于class_eval生成的是实例方法,instance_eval生成的是类方法,所以调用上有所区别,在代码中都有体现。此处可以细细深究一下,注意self的值。

 

分享到:
评论

相关推荐

    《Ruby Programming—向Ruby之父学程序设计(第2版)》电子书

    《Ruby Programming—向Ruby之父学程序设计(第2版)》这本书旨在帮助初学者,甚至是完全没有编程背景的读者,快速掌握Ruby语言的基础和高级概念。 首先,Ruby是一种动态类型语言,这意味着变量的类型在运行时自动...

    From Java to Ruby

    Java的OOP体系严谨,类定义严格,而Ruby则更加灵活,允许动态地添加和修改类的方法。Ruby的块和闭包是其独特之处,它们提供了强大的控制流和数据处理能力,这是Java中匿名内部类和接口不能比拟的。 其次,Ruby的...

    ruby语法基础教程及Ruby教程中文版和安装文件

    所有Ruby对象都是类的实例,而类则是对象。你可以创建自定义类并定义方法、属性和继承结构。以下是一个简单的类示例: ```ruby class Person attr_accessor :name, :age def initialize(name, age) @name = ...

    ruby官方chm文档

    Ruby标准库提供了大量预先定义的模块和类,方便开发者在各种场景下快速开发。其中包括文件操作、网络通信、XML解析、日期和时间处理、数学运算等功能。例如,`File`类用于处理文件和目录,`Net::HTTP`用于HTTP通信,...

    Ruby基础教程(中文第4版)

    Ruby的类定义使用关键字"class",对象是类的实例,可以通过消息传递来调用方法。Ruby还引入了模块(module)作为命名空间管理和实现多重继承的手段。 Ruby的元编程能力是其独特之处。通过反射API,开发者可以在运行...

    Ruby新手学习书(Ruby语言中文教程)和Rails_4_days

    6. **元编程**:Ruby的动态特性允许你在运行时修改代码,这是其独特魅力之一。元编程让你能够编写更加灵活和强大的代码。 7. **标准库与Gem**:Ruby拥有丰富的标准库,同时社区还提供了无数的Gem(Ruby的库或模块)...

    Ruby-一个Ruby的例子

    首先,Ruby的面向对象特性是其核心之一。在Ruby中,一切都是对象,包括基本数据类型如数字、字符串和布尔值。例如,当你在Ruby中写下"hello",它实际上是一个String对象,你可以调用方法在它上面操作,如`"hello"....

    ruby中英文api

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法著称,尤其适合Web开发,其中Rails框架是其最著名的应用之一。API(Application Programming Interface)是软件开发者用来与操作系统、库或服务进行...

    笨办法学ruby_笨办法学ruby_ruby_bravevk4_

    书中的章节会逐步引导你了解如何声明变量、数据类型(包括字符串、数字、数组和哈希)、控制流(如条件语句和循环)、函数定义以及类和对象的概念。此外,你还会学习到Ruby的模块系统,它是组织代码和实现命名空间的...

    Ruby元编程第二版中文

    1. **方法定义与调用**:Ruby允许在运行时定义和修改方法,如`define_method`函数可以动态创建方法,而`send`或`__send__`则用于在运行时调用方法。 2. **类与模块操作**:Ruby的`Class.new`和`Module.new`可以用来...

    Ruby语言入门教程

    Ruby的块(Block)和 Proc 对象是其独特功能之一。块是一段可以在函数或方法中传递的代码,通常由`do..end`或花括号`{}`包裹。Proc对象可以捕获一个块并存储起来,之后在需要时调用。Lambda也是类似的概念,但它们在...

    eloquent ruby

    - 元编程是Ruby的核心优势之一。 - 动态创建方法和属性。 - 使用评估(Evaluation)和反射(Reflection)技术。 - 扩展和覆盖内置行为。 6. **测试与调试** - Ruby提供了丰富的测试框架,如RSpec和Test::Unit等。 ...

    ruby元编程.pdf

    Ruby元编程是Ruby编程语言中的一个重要特色,它指的是Ruby语言允许程序员在运行时对类、方法和变量等进行操作的能力。通过元编程,开发者可以编写出更加简洁、灵活和高效的代码。《Metaprogramming Ruby》这本书深入...

    Ruby-Yard是一款Ruby文档工具

    与其他文档工具相比,Yard的一个显著优势在于它支持自定义域特定语言(DSL)的文档,这意味着你可以为你的特定项目或库定义自己的文档样式和结构。 Yard的另一个亮点是其模板系统。默认情况下,Yard会生成一套标准...

    Ruby之路

    《Ruby之路》是关于Ruby编程语言的一本详细指南,作者旨在揭示“Ruby之道”,即如何在Ruby编程中运用有效的解决方案和技术。第二版于2006年10月由Addison-Wesley出版,它全面地涵盖了Ruby语言的核心概念、语法特性...

    learning-ruby.

    3. **函数与方法**:Ruby中的函数称为方法,可以定义全局方法或类方法。了解如何定义、调用和传递参数是学习Ruby的重要部分。 4. **面向对象编程**:Ruby是一种纯面向对象的语言,每个值都是一个对象,每种类型都是...

    ruby 经典教程从新手到专家

    - **面向对象编程(OOP)**:详细解释Ruby中的类、对象、继承、封装、多态等OOP核心概念。 - **程序结构**:探讨模块、混合和命名空间,如何组织大型Ruby项目。 #### 第二部分:进阶技巧 - **元编程**:讲解Ruby的元...

    ruby中文文档中心资料

    类定义了对象的属性(或称为实例变量)和行为(或称为方法)。Ruby支持单继承,但通过模块,可以实现一种形式的多继承,即混入。模块可以包含方法和常量,可以通过`include`关键字将模块的方法引入到类中。 Ruby的...

    ruby语法自整理

    - Ruby是面向对象的语言,类定义以`class`关键字开始,类名首字母大写。 - `initialize`是类的构造方法,用于初始化实例变量。 - 类方法通过`def self.method_name`定义。 - 实例方法通过`def method_name`定义...

Global site tag (gtag.js) - Google Analytics